📜  如何在 Linux 中启用 Shell 脚本调试模式?

📅  最后修改于: 2022-05-13 01:57:26.671000             🧑  作者: Mango

如何在 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 /

输出:

-x 输出

图 1:使用 bash 的 -x 选项跟踪 HelloWorld.sh 输出。

在上图中,我们看到代码在执行之前被跟踪(打印),然后是它的相关输出,并且进一步跟踪列表(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

输出:

奇数/偶数输出

图 2:使用 bash 的 -x 选项跟踪 OddEven.sh 输出。

与前面的示例类似,每行代码在执行之前都会被跟踪。

  • -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 输出

图 3:使用 bash 的 -n 选项检查 OddEven.sh 中的语法错误。

当使用 -n 选项执行脚本时,输出会显示出现语法错误的代码行的确切行号位置。然后当错误被修复并使用相同的选项再次运行时,将显示以下输出 -

修正错误后的输出

图 4:使用 bash 的 -n 选项更正 OddEven.sh 中的语法错误后。

这表明该脚本没有语法错误。

  • -v:如果需要在脚本执行时阅读注释和整个脚本,那么 -v 选项可以帮助我们实现这一目标。以下示例屏幕截图显示了 -v 和 -x 之间的区别以及我们如何使用 -v 选项。以下示例中使用了与上述示例中相同的 OddEven.sh 脚本文件。
-v 选项输出

图 5:在 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

输出:

图 6:对 Shell 脚本中的某些代码行进行调试/跟踪。

在此示例中,仅调试 OddEven.sh 脚本的逻辑位。在指定了 set -x 选项的终端输出中仅跟踪那些输出。