shell调试技巧
trap调试技巧一
tee调试技巧二
调试钩子
sh 执行选项调试
eval用法
declare定义变量
- 使用trap命令
shell脚本执行时会产生三个所谓的伪信号,可以使用trap命令捕获这三个“伪信号”,并输出相关的调试信息
| 信号名 | 产生原因 |
|---|---|
| EXIT | 从一个函数中退出或整个脚本执行完毕 |
| ERR | 从一条命令返回非零状态时(代表命令执行不成功) |
| DEBUG | 脚本中每一条命令执行之前 |
- 示例一
#!/bin/bash
ERRTRAP()
{
echo "[LINE: $1] Error: Command or function exited with status $?"
}
foo()
{
return 1;
}
trap 'ERRTRAP $LINENO' ERR
abc
foo

- 示例二
#!/bin/bash
trap 'echo "befor execute line:$LINENO, a=$a,b=$a,c=$c"' DEBUG
a=1
if [ "$a" -eq 1 ]
then
b=2
else
b=1
fi
c=3
echo "end"

-
tee调试技巧二
tee命令会从标准输入读取数据,将其内容输出到标准输出设备,同时又可将内容保存成文件。 -
示例一
ipaddr=`hostname -I|cut -d' ' -f1|tee temp.txt`
echo $ipaddr
- 调试钩子
在脚本的开发调试阶段,可以先执行export DEBUG=true命令打开调试钩子,使其输出调试信息,export DEBUG=false可以全部屏蔽
TRACE()
{
if [ "$DEBUG" = "true" ]; then
$@
fi
}
a=1
TRACE echo "a=$a"
if [ "$a" -eq 1 ]; then
echo $a
fi
- sh 执行选项调试
-n 测试shell脚本是否存在语法错误,但不会世界之行命令
-x 进入跟中方式,显示所执行的每一条命令
-c "string" 从string中读取命令sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'
-x 加强 默认缺省$PS4的值是“+” export PS4='+{$LINENO:${FUNCNAME[0]}} '
- 脚本中调用脚本
a脚本
#!/bin/bash
function fun()
{
echo "xiaozhao"
}
a=`hostname -I`
b脚本
. first.sh
fun
- eval用法'
示例1
a=123
echo '$a'
eval echo '$a'
-f [name]:列出之前由用户在脚本中定义的函数名称和函数体;
-F [name]:仅列出自定义函数名称;
-g name:在shell函数中可创建全局变量;
-p [name]:显示指定变量的属性和值;
-a name:声明变量为普通数组;
-A name:声明变量为关联数组(支持索引下标为字符串);
-i name :将变量定义为整数型(求值结果仅为整数,否则显示为0);
-r [name[=value]] 或 readonly name:将变量定义为只读(不可修改和删除);
-x name[=value] 或 export name[=value]:将变量设置为环境变量;
示例1
set -o errexit
hput()
{
eval "hkey_$1"="$2"
}
hget()
{
eval echo '${'"hkey_$1"'}'
}
hput k1 value1
hget k1
declare -A dic
dic=([key1]="value1" [key2]="value2" [key3]="value3")
echo ${dic["key1"]}
echo ${!dic[@]}
echo ${dic[@]}
for key in ${!dic[@]}
do
echo "$key : ${dic[$key]}"
done


浙公网安备 33010602011771号