在shell脚本开发的过程中,随着里面结构和命令的越来越多,犯错误的机会就很大了,所以掌握一到两种调试方法很有用,当然关于shell script的调试方法我听过好几种,不过会用的也就这么几个方法。总之,十鸟在林,不如一鸟在手!^_^
效果:
./debug.sh
1、利用bash的的“-n”“-x”选项,最简单实用
- -n: 只是将脚本都读取一遍,检查是否有语法错误
- 用法: bash -n my_script.sh 或者在脚本里面的“#!/bin/bash -n”,下面默认是指在脚本里面中使用选项
- 效果: 如果有语法错误,会提示,没有检测到语法错误,则安静的退出
-x: 调试选项,显示每条语句,以“+”开头,其后的变量都经过替换了,强烈推荐,经常与trap DEBUG配合使用trap的用法后面会提到
效果:
./debug.sh
+ trap 'echo "在 $LINENO 行之前,变量 a=$a , b=$b"' DEBUG #这是命令行本身,以一个‘+’开头
++ echo '在 9 行之前,变量 a= , b=' #这是输出,以两个‘++’开头
在 9 行之前,变量 a= , b= #开头提示符'+'可以通过PS4调整,如PS4='*'
+ a=1
++ echo '在 10 行之前,变量 a=1 , b='
2、使用trap命令
格式:trap '命令或者函数,数量不限' Signal
- 这里Signal(信号)不是指系统信号,系统信号可以通过“kill -l”查看,这里的信号值得是bash shell在命令或者函数
- 在执行时或者执行结束时产生的信号,常用的有
- EXIT 成功执行,结束状态码为“0”
- ERR 没有成功执行,结束状态码非“0”
- DEBUG 用于跟踪变量的值
举例说明:
(1)ERR用法:
Error_Trap(){ #定义一个当发现错误时调用的函数
echo "[Line:$1] Error: exited with status $?"
}
trap 'Error_Trap $LINENO;exit 1' ERR #如果结束状态是ERR(也就是执行失败或者错误),就调用Error_Trap函数
#然后退出,这里$LINENO是shell的内部变量,表示行号,这里是错误的位置
Test_A(){
return 1;
}
Test_B(){
return 2;
}
Test_A
Test_B #这个函数不会被执行了,因为在发现第一个错误的时候trap提示错误后就退出了,这
#样只有第一个错误解决了,才会继续执行以便发现后面的错误,继续调试
(2)DEBUG用法
vim debug.sh
...
...
trap 'echo "在第 $LINENO 行之前,变量 a=$a , b=$b"' DEBUG #用于跟踪变量的值
a=1
a=2
b=9
b=5
exit 0
...
3、记录脚本执行的日志
在脚本开发和测试的时候,脚本执行结果和过程都是我们需要注意,这里主要说如何将脚本的执行输出记录到文件中,我平时主要用tee,在shell编程技巧小结-1中已经提到
这个系列未完待续...