脚本调试的主要工作就是发现引发脚本错误的原因以及脚本源代码中定位错误行。归纳汇总了下,调试脚本时,我们可能会用到的几种方式,比如说:最简单的通过echo的方式,通过set -x的方式,比较高端一点的通过trap或bashdb工具来调试脚本。
功能: 最简单的调试方法,可以在任何怀疑出错的地方用echo打印变量
场合: 所有怀疑可能有问题的地方示例: echo $VAR
【方式二】: 通过选项方式
-n
功能: 读取shell脚本,但不实际执行
场合: 用于测试Shell脚本中是否存在语法错误
示例: # bash -n script.sh
#!/bin/bash
foo()
{
echo "Shell bash function is called"
}
echo "|--start----"
foo
echo "|--end------"
-c
功能: 该选项使Shell解析器从字符串而非文件中读取并执行命令
场合: 当需要调试一小段脚本的执行结果时,非常方便
示例: # bash -c 'x=1;y=2;let z=x+y;echo "z=$z"'
-v
功能: 区别于-x参数,该选项打印命令行的原始内容,-x参数打印出经过替换后命令行的内容
场合: 仅想显示命令行的原始内容
-x
功能: 提供跟踪执行信息,将执行脚本的过程中把实际执行的每个命令显示出来,行首显示+, +后面显示经过替换之后的命令行内容,有助于分析实际执行的是什么命令.
场合: 是调试Shell脚本的强有力工具,是Shell脚本首选的调试手段
示例: 1).在命令行提供参数:$ sh -x script.sh2).脚本开头提供参数:#!/bin/sh -x
3).在脚本中用set命令启用or禁用参数:其中set -x表启用,set +x表禁用
【方式四】: 通过trap来调试
作用: 用于捕获指定的信号并执行预定义的命令
语法: trap `command` signal
说明: signal是要捕获的信号,command是捕获到指定的信号,所要执行的命令, 可以用kill -l命令看到系统中全部可用的信号名,捕获信号后所执行的命令,可以是一条或多条合法的Shell语句,也可以是一个函数名, Shell脚本执行时,会产生三个伪信号(之所以称为伪信息,因这是shell自己产生,而非操作系统产生),通过使用trap 捕获这三个伪信号并输出信息对调试大有帮助SHELL三个伪信号
EXIT 从一个函数中退出或整个执行完毕
ERR 当一个命令执行不成功,返回非0状态时
DEBUG 脚本中每一条命令执行之前
示例:
#!/bin/bash
errorTrap()
{
echo "[LINE:$1]Error: Command or function exited with status $?"
}
foo()
{
return 1;
}
trap 'errorTrap $LINENO' ERR
abc
foo
脚本输出:
[root@localhost:shell]# bash test.sh
test.sh: line 12: abc: command not found
[LINE:12]Error: Command or function exited with status 127
[LINE:9]Error: Command or function exited with status 1
使用shell调试器bashdb,这是一个类似于GDB的调试工具,可以完成对shell脚本的断点设置,单步执行,变量观察等许多功能
使用方法: bashdb -c script.sh 或者 bashdb script.sh 或者 bashdb --debug script.sh
关于bashdb调试的,请参考链接,这篇介绍的相对详细点: http://zhangge.net/1517.html