实用小技巧:在不修改源代码情况下来调试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/上的文档并下载试用。
Shell脚本调试小技巧
最新推荐文章于 2021-05-01 08:50:01 发布