Linux Shell 脚本调试总结

Linux Shell 脚本调试总结

Shell脚本是用户与Linux操作系统交互的一种方式,在脚本编程过程中自然少不了进行调试工作,本文将介绍三种常用的调试方法.(默认使用bash shell)

追踪脚本的执行

使用-x选项可以打印出脚本执行的每一行命令以及当前状态.
有如下脚本,打印数字1到10:

#!/bin/bash

for i in {1..10}
do
    echo $i
done

我们使用-x选项进行调试如下:

#在每一行前加上行号
export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
#进行调试
sh -x test.sh 
#调试结果
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 1
1
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 2
2
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 3
3
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 4
4
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 5
5
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 6
6
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 7
7
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 8
8
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 9
9
+test.sh:3:: for i in '{1..10}'
+test.sh:5:: echo 10
10

有时候,你只需要对脚本的一部分进行调试,那么可以使用如下命令:

set -x #在执行时显示参数和命令
set +x #禁止调试
set -v #当命令行读取时显示输入
set +v #禁止打印输入

可以使用set builtin来启用或者禁止调试打印.
对上文脚本做如下修改:

#!/bin/bash

for i in {1..10}
do
    set -x
    echo $i
    set +x
done

结果如下:

+test.sh:6:: echo 1
1
+test.sh:7:: set +x
+test.sh:6:: echo 2
2
+test.sh:7:: set +x
+test.sh:6:: echo 3
3
+test.sh:7:: set +x
+test.sh:6:: echo 4
4
+test.sh:7:: set +x
+test.sh:6:: echo 5
5
+test.sh:7:: set +x
+test.sh:6:: echo 6
6
+test.sh:7:: set +x
+test.sh:6:: echo 7
7
+test.sh:7:: set +x
+test.sh:6:: echo 8
8
+test.sh:7:: set +x
+test.sh:6:: echo 9
9
+test.sh:7:: set +x
+test.sh:6:: echo 10
10
+test.sh:7:: set +x

自定义日志

上面这种调试手段是bash内建的,而且输出格式固定而且繁琐.所以我们需要根据需要的信息,自定义格式来显示调试信息,通过设定_DEBUG环境变量来完成:

#!/bin/bash

# run:_DEBUG=on sh debug.sh

function DEBUG()
{
    [ "$_DEBUG" == "on" ] && $@ || :
}

for i in {1..5}
do
    DEBUG echo -e "This is debug line!"
    echo $i
done

我们将_DEBUG环境变量设定为一个开关,只有打开时才会输出调试日志.
使用如上脚本结果如下:

[aidu1602@ResU10 tools]$ _DEBUG=on sh debug.sh 
This is debug line!
1
This is debug line!
2
This is debug line!
3
This is debug line!
4
This is debug line!
5

这样我们就可以自定义调试信息,并且可以控制调试开关啦.

使用专用调试器

如果你需要调试一个非常复杂的脚本,并且需要一个及其专业的调试器,像GDB那样,那么我推荐这款开源的脚本调试器bashdb,具体使用可以参考它的文档.

反馈与建议

猜你喜欢

转载自blog.csdn.net/u011192270/article/details/51163934