调试完整脚本
如果要对 shell 脚本进行调试,可以通过 -x
选项来启用 shell 脚本的跟踪调试功能,可以打印出所执行的每一行命令及当前的状态。语法格式如下:
# 语法
bash -x 脚本名
# 或
sh -x 脚本名
# 示例
bash -x test.sh
sh -x test.sh
假设待调试的脚本 test.sh
内容如下:
#!/bin/bash
function print(){
local start=$1
local end=$2
for i in $(seq $start $end); do
echo "$i"
done
}
print 1 6
调试结果如下,可以看到每一步各变量的值及输出结果:
调试部分脚本
上面的命令是对整个脚本进行调试输出的,如果只想要调试部分脚本。可以使用 set [-+]x
对脚本进行部分调试。其中 set -x
开启部分调试,set +x
关闭部分调试,即对调试区域进行限制。这语句必须添加在脚本中才会生效,例如:
#!/bin/bash
function print(){
local start=$1
local end=$2
for i in $(seq $start $end); do
# 开启部分调试
set -x
echo "$i"
# 结束部分调试\
set +x
done
}
print 1 6
自定义调试脚本
上面两种调试方法都是 bash 内置的,它们以固定的格式生成调试信息。但是在很多情况下,我们需要使用自定义的调试信息。所谓的自定义调试脚本指的是什么时候输出调试信息,什么时候不输出调试信息,由我们调用脚本的人主动控制。
可以通过定义 _DEBUG
环境变量来启用或禁止调试及生成特定形式的信息。如例:
#!/bin/bash
# 自定义 DEBUG 函数,固定代码
function DEBUG() {
[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..6}; do
# 在每一条打印调试信息语句前面加上 DEBUG,如果没有把 _DEBUG=on 传递给脚本,那么下面的调试信息就不会打印出来
DEBUG echo "i is $i"
done
测试如下:
利用 shebang
调试
还可以利用 shebang
来进行调试,即将脚本第一行的 #!/bin/bash
改成 #!/bin/bash -xv
,这样不用 bash -x 脚本名
就可以开启调试了。
还有一点需要注意,调试信息会在每一行前需要加上 +
符号,那么就很难在输出的调试信息中跟踪执行流程。所以可以将环境变量 PS4
设置为 '$LINENO:'
,显示每一行的行号。
所以 test.sh
脚本如下:
#!/bin/bash -xv
# 开启行号设置
PS4='$LINENO: '
function print(){
local start=$1
local end=$2
for i in $(seq $start $end); do
echo "$i"
done
}
print 1 6