Chinaunix首页 | 论坛 | 博客
  • 博客访问: 37579
  • 博文数量: 27
  • 博客积分: 266
  • 博客等级: 二等列兵
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-28 20:45
文章分类
文章存档

2013年(15)

2012年(12)

我的朋友

分类: Python/Ruby

2012-07-12 21:23:29

在shell编写过程中,经常要调试脚本,观察脚本输出是否达到预期效果。下面来看看shell开发过程中简单的调试方法:
1.语法分析
  bash -n test.sh
  test1.sh: line 8: syntax error: unexpected end of file
其中test.sh内容如下:

点击(此处)折叠或打开

  1. #!/bin/bash
  2. ip=1
  3. if [ "$ip" = "0" ]
  4. then
  5.     echo "in if!"

  6. echo "out if"
可以看出if 语句并没有fi正常结束。
2.输出命令执行过程
  set -x 与 set x

点击(此处)折叠或打开

  1. #!/bin/bash
  2. ip=1
  3. if [ "$ip" = "1" ]
  4. then
  5.     set -x
  6.     echo "in if!"
  7.     set x
  8. fi
  9. echo "out if"
添加了set -x之后,执行脚本之时,将额外的输出脚本执行过程信息

点击(此处)折叠或打开

  1. ./test1.sh
  2. 6 19:53:06: echo 'in if!'
  3. in if!
  4. 7 19:53:06: set x
  5. out if
3. 系统参数PS4的使用
   系统默认参数PS4提示符,即脚本执行过程信息中的 ' ',我们在shell中可以重新设置PS4以获取更多的信息。
   export PS4=' {$LINENO:{$FUNCNAME}}  #LINENO为bash内置变量,记录shell当前行号;FUNCNAME记录当前所在函数。

点击(此处)折叠或打开

  1. #!/bin/bash
  2. export PS4=' {$LINENO:{$FUNCNAME}}'
  3. function set_test()
  4. {
  5.   ip=1
  6.   if [ "$ip" = "1" ]
  7.   then
  8.       set -x
  9.       echo "in if!"
  10.       set x
  11.   fi
  12. }
  13. set_test
  14. echo "out if"
执行结果为:

点击(此处)折叠或打开

  1. bash test1.sh
  2. {9:{set_test}}echo 'in if!'
  3. in if!
  4. {10:{set_test}}set x
  5. out if
4.trap捕获异常信号
  trap指令可以捕获脚本运行过程中出现的异常信号。
  格式为:trap 'command' signal
  调试脚本过程中通常使用到:ERR TERM EXIT三个信号

点击(此处)折叠或打开

  1. #!/bin/bash
  2. export PS4=' {$LINENO:{$FUNCNAME}}'
  3. function trap_err()
  4. {
  5.    ip=1
  6.    if [ "$ip" = "1" ]
  7.    then
  8.        set -x
  9.        echo "catch error!"
  10.        set x
  11.    fi
  12.    exit 1
  13. }
  14. trap 'trap_err' ERR
  15. set_test
  16. echo "out if"
脚本运行到15行,因为set_test既不是指令,又不是自定义的函数,执行出错;trap捕获到ERR信号,执行trap_err函数。
执行结果:

点击(此处)折叠或打开

  1. bash test1.sh
  2. test1.sh: line 15: set_test: command not found
  3. {9:{trap_err}}echo 'catch error!'
  4. catch error!
  5. {10:{trap_err}}set x
    简单的介绍shell脚本中几种调试方法,其实上面描述的方法在脚本运行期间对日志收集以及异常处理也很有帮助。
    以上测试脚本均是临时书写,如有错误不正之处,欢迎大家指正批评。如有其它的脚本调试方法也希望大家可以分享经验,共同讨论。
阅读(2005) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~