跳转至

调试 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选项跟踪脚本的执行,
回到页面顶部