iamlaosong文

这儿说的shell脚本是指默认的bash shell脚本。常见的方法如下:

1、用echo、pwd等命令显示适当的内容,判断执行情况。

2、暂停执行,查看执行结果。

Linux没有类似Pause的命令但可以用下面命令代替:

read -p "Press any key to continue..." var

其中的var是变量名称,用来存放输入的内容。例如:

read -p "Please input your name" myname

3、跟踪脚本的执行。

Shell提供了一些用于调试脚本的选项:
-n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
-v,一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。
-x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
前两种不常用,主要用-x进行调试。

使用这些选项有三种方法

第一种:跟踪所有脚本

通过shell的命令行参数进行调试。

运行:sh -x tt.sh

如果需要在跟踪过程中显示语句在原脚本中的行号,可以设置PS4这个环境变量如下:

export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '

这样情况下,跟踪时语句前面会显示脚本文件名、行号、函数名等。

第二种:跟踪部分脚本

如果只是跟踪其中一部分,可以在脚本中用set -x命令打开跟踪,再用set +x命令关闭跟踪:

set -x
...
set +x
...
运行:./tt.sh

注意:我们在运行脚本的时候,不需要使用bash -x了。

如果脚本中需要屏蔽一部分不执行,可以用-n这个参数,即:

set -n
需要屏蔽的代码
set +n
...

第三种:另一种跟踪所有脚本方法

在脚本第一行增加:

#!/bin/sh -x

运行同第二种:./tt.sh

shell文件的首行的#!/bin/sh是告诉内核用哪一个shell解释器去解释你的脚本,例如:

#!/bin/bash 以bash shell来解释
 #!/bin/csh 以csh shell来解释
 #!/bin/sh 以sh shell来解释(Linux中sh就是bash的符号连接)

参见:Linux脚本开头#!/bin/bash和#!/bin/sh是什么意思以及区别

4、日志输出

一是将脚本输出重定向到一个文件,二是脚本中某些命令后面加上重定向到一个文件:

./tt.sh >tt.log 2>tt.err

======================================================================

一般的脚本使用上面的调试方法就够了,如果脚本太大,则

使用Bash专用调试器

如果你在写一个相当复杂的脚本,并且,你需要一个完整的像调试别的语言一样的调试器,那么你可以试着用用这个开源软件—— bashdb, 一个Bash的专用调试器。这个调试器很强大,你想得到的功能,他都有,比如,设置断点,单步跟踪,跳出函数,等等。