Linux拓展之调试脚本

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux拓展之调试脚本相关的知识,希望对你有一定的参考价值。

调试完整脚本

如果要对 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

以上是关于Linux拓展之调试脚本的主要内容,如果未能解决你的问题,请参考以下文章

Linux拓展之Shell默认变量值

Linux拓展之Shell中求字符串的长度

Linux入门第五天——shell脚本入门(下)基础语法之循环与调试

Linux入门第五天——shell脚本入门(下)基础语法之调试debug

Linux 脚本运维总结之Shell script

Nginx框架之Lua拓展