如何在 Linux 中启用 Shell 脚本调试模式?
Linux 是一种非常流行的操作系统,尤其是在开发人员和计算机科学界,因为它具有强大的内核能力。主要的 Linux 发行版(通常称为 Linux 发行版)本质上是开源的(源代码可用并可根据要求进行修改),如 Ubuntu、CentOS 等。
Bash 是一种非常流行的 shell 脚本语言,当您在 Linux 中打开终端时,它会在后端执行。 DevOps(负责更频繁部署的运营团队)使用 Bash/Shell 脚本(写在一个文件中的一系列命令以有序的方式一起执行)来自动化通常/极简/琐碎的任务,例如运行检查哪个文件上的时间戳生成/更新,检查多个文件等。
调试是一个术语,表示识别错误并可能在计算机硬件或软件中解决它们的过程。就像所有其他编程/编码语言一样,调试在 bash/shell 脚本中至关重要,以便了解程序的流程并在发生错误时解决它们。
在本文中,让我们讨论调试 shell 脚本的两种方法,为了帮助加强理解,我将尝试使用 1 个简单的 shell 脚本(Hello World 和 List),并在其基础上构建一个条件 shell 脚本(奇数/甚至)。
1. 使用bash选项(-x, -n, -v):以下是各种选项的详细解释:
- -x:它有助于在执行之前跟踪命令输出,当我们使用此选项运行脚本时,我们会在执行之前跟踪每一行代码,并将其各自的输出打印在终端中。下面是一个简单的 HelloWorld.sh 脚本,它的执行截图也是如此。
#! /bin/bash
# print Hello World
echo 'Hello World'
# Listing all components on root
ls /
输出:
在上图中,我们看到代码在执行之前被跟踪(打印),然后是它的相关输出,并且进一步跟踪列表(ls)的代码,然后是它的执行。让我们使用以下示例 (OddEven.sh) 进一步构建,该示例会提示用户输入并告知输入的数字是否为奇数/偶数。
#! /bin/bash
# Take input from the user
echo -n "Enter a number"
read n
# Calculate remainder using mod (%) operator
remainder=$(( $n % 2 ))
# Odd or Even Check
if [ $remainder -eq 0 ]
then
echo "You have entered $n -- which is an Even number"
else
echo "You have entered $n -- which is an Odd number"
fi
输出:
与前面的示例类似,每行代码在执行之前都会被跟踪。
- -n:它有助于在执行之前检查 shell 脚本中是否存在语法错误。随着云计算技术的蓬勃发展,了解各种命令行选项来检查语法错误是必不可少的。很难在云中执行的虚拟机上拥有 GUI(图形用户界面)或指定的 IDE(集成开发环境)。因此,此选项有助于使用 CLI(命令行界面)对脚本执行语法检查。让我们使用下面的例子来理解它的应用,它有一个 OddEven.sh 脚本,它故意有一个小的语法错误。
#! /bin/bash
# Take input from the user
echo -n "Enter a number"
read n
# Calculate remainder using mod (%) operator
remainder=$(( $n % 2 ))
# Odd or Even Check
if [ $remainder -eq 0 ]
then
echo "You have entered $n -- which is an Even number'
else
echo "You have entered $n -- which is an Odd number"
fi
输出:
当使用 -n 选项执行脚本时,输出会显示出现语法错误的代码行的确切行号位置。然后当错误被修复并使用相同的选项再次运行时,将显示以下输出 -
这表明该脚本没有语法错误。
- -v:如果需要在脚本执行时阅读注释和整个脚本,那么 -v 选项可以帮助我们实现这一目标。以下示例屏幕截图显示了 -v 和 -x 之间的区别以及我们如何使用 -v 选项。以下示例中使用了与上述示例中相同的 OddEven.sh 脚本文件。
在上面的代码中,所有的注释和代码都是可见的(就像整个“if 块”,而不仅仅是被执行的行)。
这样做的一个小缺点是需要对整个脚本执行调试检查,如果脚本很大,从 -x 选项的输出中找到有用的见解非常困难/乏味。因此,让我们在 Next way of Debugging 中看看仅调试脚本的某些特定部分。
2.使用 set -x inside script 指定脚本。
假设我们只想调试/跟踪 OddEven.sh 脚本的某个逻辑部分,而不是整个脚本。我们可以在要调试的代码之前设置 -x标志,然后再次将其设置回+x ,其中需要禁用代码跟踪。以下示例代码和屏幕截图帮助我们描绘了这种情况。
#! /bin/bash
# Take input from the user
echo -n "Enter a number"
read n
# Enabling trace
set -x
# Calculate remainder using mod (%) operator
remainder=$(( $n % 2 ))
# Disabling trace
set +x
# Odd or Even Check
if [ $remainder -eq 0 ]
then
echo "You have entered $n -- which is an Even number"
else
echo "You have entered $n -- which is an Odd number"
fi
输出:
在此示例中,仅调试 OddEven.sh 脚本的逻辑位。在指定了 set -x 选项的终端输出中仅跟踪那些输出。