shell 脚本调试

参数 -x 跟踪脚本

 
  
  1. shell 脚本调试参数 -x  
  2. #BASH 
  3. [root@74 ~]# bash -x /usr/local/keepalived/haproxy_check.sh  
  4. eth1_ip=10.0.100.74 
  5. eth0_ip=192.168.57.74 
  6. eth1_url=http://10.0.100.74:80 
  7. eth0_url=http://192.168.57.74:80 
  8. ++ ps -C keepalived --no-header 
  9. ++ wc -l 
  10. keepalived=0 
  11. + true 
  12. failed=0 
  13. + curl -IL http://192.168.57.74:80 
  14. + true 
  15. ++ date '+ %F_%T' 
  16. date=' 2011-12-16_11:57:51' 
  17. + curl -IL http://192.168.57.74:80 
  18. + curl -IL http://10.0.100.74:80 
  19. check=0 
  20. + sleep 1 
  21. + '[' 0 -eq 2 ']' 
  22.  
  23. #同样SH 也有-x 调试功能,在脚本尾部添加“abc”,然后使用-x 调试该脚本,将返回错误信息 
  24. [root@74 ~]# sh -x /usr/local/keepalived/haproxy_check.sh  
  25. eth1_ip=10.0.100.74 
  26. eth0_ip=192.168.57.74 
  27. eth1_url=http://10.0.100.74:80 
  28. eth0_url=http://192.168.57.74:80 
  29. ++ ps -C keepalived --no-header 
  30. ++ wc -l 
  31. keepalived=0 
  32. + true 
  33. failed=0 
  34. + curl -IL http://192.168.57.74:80 
  35. + true 
  36. ++ date '+ %F_%T' 
  37. date=' 2011-12-16_11:56:37' 
  38. + curl -IL http://192.168.57.74:80 
  39. + curl -IL http://10.0.100.74:80 
  40. check=0 
  41. + sleep 1 
  42. + '[' 0 -eq 2 ']' 
  43. + break 2 
  44.  
  45. + break 2 
  46. + abc
  47. /usr/local/keepalived/haproxy_check.sh: line 40: abc: command not found

使用PS4,更详细的输出

 
  
  1. [root@74 ~]# export PS4='+{$LINENO:${FUNCNAME[0]}} '
  2. [root@74 ~]# sh -x /usr/local/keepalived/haproxy_check.sh  
  3. +{6:} eth1_ip=10.0.100.74 
  4. +{7:} eth0_ip=192.168.57.74 
  5. +{8:} eth1_url=http://10.0.100.74:80 
  6. +{9:} eth0_url=http://192.168.57.74:80 
  7. ++{10:} wc -l 
  8. ++{10:} ps -C keepalived --no-header 
  9. +{10:} keepalived=0 
  10. +{12:} true 
  11. +{13:} failed=0 
  12. +{15:} curl -IL http://192.168.57.74:80 
  13. +{18:} true 
  14. ++{19:} date '+ %F_%T' 
  15. +{19:} date=' 2011-12-16_12:54:13' 
  16. +{21:} curl -IL http://192.168.57.74:80 
  17. +{21:} curl -IL http://10.0.100.74:80 
  18. +{22:} check=0 
  19. +{23:} sleep 1 
  20. +{26:} '[' 0 -eq 2 ']' 
  21. +{29:} break 2 

 

参数 -n 检查语法是否错误,但不会实际执行命令!

去掉脚本 if 后边的 then 试试

 
  
  1. sh -n /usr/local/keepalived/haproxy_check.sh  
  2. /usr/local/keepalived/haproxy_check.sh: line 28: syntax error near unexpected token `else' 
  3. /usr/local/keepalived/haproxy_check.sh: line 28: `        else' 

 


其它参数摘自IBM

 
  
  1. 使用shell的执行选项,本节将介绍一些常用选项的用法: 
  2.  
  3. -n 只读取shell脚本,但不实际执行 
  4. -x 进入跟踪方式,显示所执行的每一条命令 
  5. -c "string" 从strings中读取命令 
  6.  
  7. “-n”可用于测试shell脚本是否存在语法错误,但不会实际执行命令。
  8. 在shell脚本编写完成之后,实际执行之前,首先使用“-n”选项来测试脚本是否存在语法错误是一个很好的习惯。
  9. 因为某些shell脚本在执行时会对系统环境产生影响,比如生成或移动文件等,如果在实际执行才发现语法错误,
  10. 您不得不手工做一些系统环境的恢复工作才能继续测试这个脚本。 
  11.  
  12. “-c”选项使shell解释器从一个字符串中而不是从一个文件中读取并执行shell命令。
  13. 当需要临时测试一小段脚本的执行结果时,可以使用这个选项,如下所示: 
  14. sh -c 'a=1;b=2;let c=$a+$b;echo "c=$c"' 
  15.  
  16. "-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。
  17. “-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 
  18. "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 
  19. “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。  

 

总结摘自IBM

 
  
  1. 调试shell脚本的过程: 
  2. 首先使用“-n”选项检查语法错误,然后使用“-x”选项跟踪脚本的执行,使用“-x”选项之前,
  3. 别忘了先定制PS4变量的值来增强“-x”选项的输出信息,至少应该令其输出行号信息
  4. (先执行export PS4='+[$LINENO]',更一劳永逸的办法是将这条语句加到您用户主目录的.bash_profile文件中去),这将使你的调试之旅更轻松。
  5. 也可以利用trap,调试钩子等手段输出关键调试信息,快速缩小排查错误的范围,并在脚本中使用“set -x”及“set +x”对某些代码块进行重点跟踪。
  6. 这样多种手段齐下,相信您已经可以比较轻松地抓出您的shell脚本中的臭虫了。 

 

结束