Shell脚本调试小技巧

实用小技巧:在不修改源代码情况下来调试shell脚本。

Shell的执行选项:
   -n:只读取shell脚本,但不实际执行-------->主要用来检查 语法 错误
   -x:进入跟踪方式,显示所执行的每一条命令--------->主要用来临时测试一小段脚本
   -c:"string" 从strings中读取命令,使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,
        并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。


示例:下面是一个存在bug的shell脚本。
[root@rbmstest1 getopts]# cat -n shellscript_debug.sh 
     1 #!/bin/bash
     2 #
     3 # 脚本示范如何用"-n"以及增强的"-x"执行选项来调试shell脚本。
     4 # 脚本中定义了一个函数isRoot(),用于判断当前用户是不是root用户,如果不是,则中止脚本的执行
     5 #
     6
     7 isRoot()
     8 {
     9 if [ "$UID" -ne 0 ]
    10   return 1
    11 else
    12   return 0
    13 fi
    14 }
    15 isRoot
    16 if ["$?" -ne 0 ]
    17 then
    18  echo "Must be root to run this script"
    19  exit 1
    20 else
    21  echo "welcome root user"
    22  #do something
    23 fi




1.首先执行sh –n shellscript_debug.sh来进行语法检查,输出如下:
[root@rbmstest1 getopts]# sh -n shellscript_debug.sh 
shellscript_debug.sh: line 11: syntax error near unexpected token `else'
shellscript_debug.sh: line 11: ` else'


发现了一个语法错误,通过仔细检查第11行前后的命令,我们发现是第9行的if语句缺少then关键字引起的。我们可以把第9行修改为if [ "$UID" -ne 0 ]; then来修正这个错误。
再次运行sh –n shellscript_debug.sh来进行语法检查,没有再报告错误。


2.实际执行这个脚本了,执行结果如下:
[root@rbmstest1 getopts]# sh shellscript_debug.sh 
shellscript_debug.sh: line 16: [0: command not found
welcome root user


3.定制$PS4的值,并使用"-x"选项来跟踪:
[root@rbmstest1 getopts]# export PS4='+{$LINENO:${FUNCNAME[0]}} '
[root@rbmstest1 getopts]# sh -x  shellscript_debug.sh 
+{15:} isRoot
+{9:isRoot} '[' 0 -ne 0 ']'
+{12:isRoot} return 0
+{16:} '[0' -ne 0 ']'
shellscript_debug.sh: line 16: [0: command not found
+{21:} echo 'welcome root user'
welcome root user


可知由于第16行的[号后面缺少了一个空格,导致[号与紧挨它的变量$?的值1被shell解释器看作了一个整体,
并试着把这个整体视为一个命令来执行,故有"[1: command not found"这样的错误提示。只需在[号后面插入一个空格就一切正常了。





如果您的脚本足够复杂,还需要更强的调试能力,可以使用shell调试器bashdb,这是一个类似于GDB的调试工具,
可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能,使用bashdb对阅读和理解复杂的shell脚本也会大有裨益。


关于bashdb的安装和使用,可参阅http://bashdb.sourceforge.net/上的文档并下载试用。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值