调试 Shell 脚本
2013-03-16 by dongnan
举个栗子
bash 使用-x
参数跟踪脚本:
bash -x /usr/local/keepalived/haproxy_check.sh
+ eth1_ip=10.0.100.74
+ eth0_ip=192.168.57.74
+ eth1_url=http://10.0.100.74:80
+ eth0_url=http://192.168.57.74:80
++ ps -C keepalived --no-header
++ wc -l
+ keepalived=0
+ true
+ failed=0
+ curl -IL http://192.168.57.74:80
+ true
++ date '+ %F_%T'
+ date=' 2011-12-16_11:57:51'
+ curl -IL http://192.168.57.74:80
+ curl -IL http://10.0.100.74:80
+ check=0
+ sleep 1
+ '[' 0 -eq 2 ']'
同样SH
也可以使用-x
参数调试脚本,我们在脚本尾部添加abc
让脚本出错:
sh -x /usr/local/keepalived/haproxy_check.sh
+ eth1_ip=10.0.100.74
+ eth0_ip=192.168.57.74
+ eth1_url=http://10.0.100.74:80
+ eth0_url=http://192.168.57.74:80
++ ps -C keepalived --no-header
++ wc -l
+ keepalived=0
+ true
+ failed=0
+ curl -IL http://192.168.57.74:80
+ true
++ date '+ %F_%T'
+ date=' 2011-12-16_11:56:37'
+ curl -IL http://192.168.57.74:80
+ curl -IL http://10.0.100.74:80
+ check=0
+ sleep 1
+ '[' 0 -eq 2 ']'
+ break 2
+ break 2
+ abc
/usr/local/keepalived/haproxy_check.sh: line 40: abc: command not found
还可以自定义PS4
变量,如带有脚本行号:
# 定义变量
export PS4='+{$LINENO:${FUNCNAME[0]}} '
# 调试脚本
sh -x /usr/local/keepalived/haproxy_check.sh
+{6:} eth1_ip=10.0.100.74
+{7:} eth0_ip=192.168.57.74
+{8:} eth1_url=http://10.0.100.74:80
+{9:} eth0_url=http://192.168.57.74:80
++{10:} wc -l
++{10:} ps -C keepalived --no-header
+{10:} keepalived=0
+{12:} true
+{13:} failed=0
+{15:} curl -IL http://192.168.57.74:80
+{18:} true
++{19:} date '+ %F_%T'
+{19:} date=' 2011-12-16_12:54:13'
+{21:} curl -IL http://192.168.57.74:80
+{21:} curl -IL http://10.0.100.74:80
+{22:} check=0
+{23:} sleep 1
+{26:} '[' 0 -eq 2 ']'
+{29:} break 2
使用参数-n
检查脚本语法是否错误,但不会实际执行命令:
# 去掉脚本 if 后边的 then
sh -n /usr/local/keepalived/haproxy_check.sh
/usr/local/keepalived/haproxy_check.sh: line 28: syntax error near unexpected token `else'
/usr/local/keepalived/haproxy_check.sh: line 28: ` else'
参数选项
常用参数选项:
-n
用于测试shell脚本是否存在语法错误,但不会实际执行命令。-x
用于跟踪脚本的执行,显示所执行的每一条命令。-c
"string",从字符串中读取命令,当临时测试一小段脚本的执行结果时,可以使用这个选项,如sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"'
小结
调试脚本的大致过程:
- 调试脚本前可以先定制
PS4
变量的值来增强-x
选项的输出信息,例如输出行号信息。 - 首先使用
-n
选项检查语法错误, - 然后使用
-x
选项跟踪脚本的执行,