如何在Linux下调试Bash Shell脚本的方法
新手写了一个 hello world 小脚本,如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢?
这是 Linux / Unix 系统管理员或新用户最常问的问题。shell 脚本调试可能是一项繁琐的工作(不容易阅读)。调试 shell 脚本有多种方法。
您需要传递-x或-v参数,以在 bash shell 中浏览每行代码。
让我们看看如何使用各种方法调试 Linux 和 UNIX 上运行的脚本。
-x 选项来调试脚本
用 -x 选项来运行脚本:
$ bash -x fcbu.com.sh
使用 set 内置命令
bash shell 提供调试选项,可以打开或关闭使用 set 命令:
set -x : 显示命令及其执行时的参数。
set -v : 显示 shell 输入行作为它们读取的
可以在 shell 脚本本身中使用上面的两个命令:
#!/bin/bash
# turn on debug mode
set -x
for f in *
do
file $f
done
# turn OFF debug mode
set +x
ls
在脚本的起始位置可以用以下代码调试:
#!/bin/bash -xv
使用bash智能调试功能
首先添加一个叫做 _DEBUG 的特殊变量。当你需要调试脚本的时候,设置 _DEBUG 为 on:
在脚本的开头放置以下赋值和函数:
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@
}
现在,只要你需要调试,只需使用 DEBUG 函数如下:
DEBUG echo "File is $filename"
或者:
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x
当调试完(在移动你的脚本到生产环境之前)设置 _DEBUG为off或非 'on' 的任何字符。不需要删除调试行。
示例脚本:
#!/bin/bash
_DEBUG="on"
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@
}
DEBUG echo 'Reading files'
for i in *
do
grep 'something' $i > /dev/null
[ $? -eq 0 ] && echo "Found in $i file"
done
DEBUG set -x
a=2
b=3
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"
保存并关闭文件。运行脚本如下输出:
Reading files
Found in xyz.txt file
+ a=2
+ b=3
+ c=5
+ DEBUG set +x
+ '[' on == on ']'
+ set +x
2 + 3 = 5
现在设置 _DEBUG 为 off(你需要编辑该文件):
_DEBUG="off"
运行脚本,输出:
Found in xyz.txt file
2 + 3 = 5
以上是一个简单但非常有效的技术。还可以尝试使用 DEBUG 作为别名而不是函数。