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 

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

posted on 2021-07-24 07:17  lodger47  阅读(100)  评论(0)    收藏  举报

导航