在大多数编程语言中,都有调试工具可用于调试。调试器是一种可以运行程序或脚本的工具,它使您能够在脚本或程序运行时检查其内部结构。
在这篇文章中,我们将学习如何在 linux 中逐行调试 bash shell 脚本。在 shell 脚本中,我们没有任何调试工具,但是在 bash 命令行选项 (如 -n, -v ,-x) 的帮助下,我们可以进行调试。
检查 Shell 脚本语法错误
当我们在 bash 命令中使用 -n 选项运行脚本时,它不会执行脚本,但它会读取脚本并验证语法,如果有错误,则会报告错误。
让我们创建一个包含以下内容的脚本
$ vi debug_quotes.sh
#!/bin/bash
echo "USER=$USER"
echo "Today's Date: $(date)
echo "SHELL=$SHELL"
保存并关闭该文件。
现在尝试使用 -n 选项运行脚本
$ bash -n debug_quotes.sh
debug_quotes.sh: line 4: unexpected EOF while looking for matching `"'
debug_quotes.sh: line 5: syntax error: unexpected end of file
$
上面的输出显示有语法错误,缺少双引号。要解决这个问题,在显示今天日期的行尾加上双引号。
以详细模式运行 Shell 脚本
bash 命令中的 -v 选项告诉 shell 脚本以详细模式运行。实际上,这意味着 shell 将在执行命令之前回显每个命令。这是非常有用的,因为它通常可以帮助找到错误。
让我们创建一个名为 listusers.sh 的 shell 脚本,其中包含以下内容
$ vi listusers.sh
#!/bin/bash
cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt
awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
#Clean up the temporary file.
/bin/rm -f /tmp/users.txt
使用 -v 选项执行脚本
$ bash -v listusers.sh
在上面的输出中,脚本输出与执行的命令混合在一起。但是,使用 -v 选项,至少您可以更好地了解 shell 在运行脚本时正在做什么。
使用 -n 和 -v 选项运行脚本
我们可以组合使用 -n 和 -v 命令行选项,这是一个很好的组合,因为我们可以在查看脚本输出的同时检查脚本的语法。
让我们回顾思考之前使用的脚本“debug_quotes.sh”
$ bash -nv debug_quotes.sh
#!/bin/bash
echo "USER=$USER"
echo "Today's Date: $(date)
echo "SHELL=$SHELL"
debug_quotes.sh: line 4: unexpected EOF while looking for matching `"'
debug_quotes.sh: line 5: syntax error: unexpected end of file
$
逐行调试 shell 脚本
-x 选项是 execution trace 的缩写,它告诉 shell 在执行替换步骤后回显每个命令。因此,我们可以看到变量和命令的值。通常,这个选项本身将有助于诊断问题。
在大多数情况下,-x 选项提供了关于脚本的最有用的信息,但它可能导致大量输出。
$ bash -x listusers.sh
+ sort
+ grep sh
+ grep -v sbin
+ cut -d : -f1,5,7 /etc/passwd
+ awk -F: ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
linuxtechi linuxtechi,,,
root root
+ /bin/rm -f /tmp/users.txt
$
正如我们所看到的,shell 在每个命令前面插入了一个 + 号。
使用 ShellCheck 调试 Shell 脚本
Shellcheck 是一个免费的工具,它为我们的 bash 或 shell 脚本提供警告和建议,指出了 shell 脚本的语法和语义问题。
Ubuntu / Debian 安装
$ sudo apt install shellcheck
RHEL / Fedora / CentOS 安装
$ sudo dnf install epel-release -y
$ sudo dnf install ShellCheck
使用 shellcheck 运行上面的 debug_quotes.sh 脚本
$ shellcheck debug_quotes.sh
要抑制警告消息,请使用 -e 选项,如下所示
$ shellcheck -e SC1078 debug_quotes.sh
上面的输出确认第 3 行有语法错误,如果我们在第 3 行末尾加上双引号,那么语法错误将被修复。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。