Shell 脚本中的条件语句

LinuxBeginner
立即练习

介绍

在本实验中,你将学习如何在 Shell 编程中使用条件语句来进行逻辑决策。我们将涵盖 if-else 语句的基本语法,以及如何使用数值和字符串比较来评估条件。通过本实验的学习,你将能够编写出可以根据各种条件做出决策的 Shell 脚本。

这是一个引导实验,提供了逐步的指导来帮助你学习和练习。请仔细遵循说明完成每个步骤并获得动手经验。历史数据表明,这是一个初学者级别的实验,完成率为 97%。它在学习者中获得了 100% 的好评率。

创建你的第一个 If 语句

让我们从创建一个简单的 if 语句开始,该语句将检查名为 NAME 的变量是否等于「John」。

首先,在 WebIDE 中打开终端。默认情况下,你应该处于 /home/labex/project 目录中。如果不确定,可以随时使用 pwd 命令查看当前目录。

使用以下命令创建一个名为 if.sh 的新文件:

touch if.sh

此命令会在当前目录下创建一个名为 if.sh 的空文件。

现在,在 WebIDE 中打开 if.sh 文件。你可以通过点击 WebIDE 左侧文件资源管理器中的文件名来打开它。

将以下内容添加到文件中:

#!/bin/bash

NAME="John"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
fi

让我们来分析一下这个脚本:

  1. #!/bin/bash:这被称为「Shebang」行。它告诉系统使用哪个解释器来运行脚本。在本例中,我们使用的是 Bash。
  2. NAME="John":这一行创建了一个名为 NAME 的变量,并为其赋值为「John」。
  3. if [ "$NAME" = "John" ]; then:这是 if 语句的开始。它检查 NAME 的值是否等于「John」。
    • 方括号 [ ] 在 Bash 中实际上是一个命令,等同于 test 命令。
    • 我们将 "$NAME" 放在引号中,是为了处理 NAME 可能为空或包含空格的情况。
    • 分号和 then 是 Bash 中 if 语句语法的组成部分。
  4. echo "The name is John":如果条件为真(True),则执行这一行。
  5. fi:这标志着 if 语句的结束。它是「if」反过来拼写的结果!

添加完内容后保存文件。

现在,我们需要让脚本具有可执行权限。在类 Unix 系统中,出于安全考虑,文件默认是不可执行的。我们可以使用 chmod 命令来更改:

chmod +x if.sh

此命令为文件添加了执行权限。+x 表示「添加执行权限」。

现在,运行脚本:

./if.sh

./ 告诉 Shell 在当前目录中查找该脚本。

你应该会看到输出:The name is John

如果你没有看到这个输出,请仔细检查你保存的文件内容是否正确,以及是否已经赋予了执行权限。

添加 Else 子句

现在,让我们扩展 if 语句,加入 else 子句。这允许我们指定当条件为假(False)时应该执行的操作。

再次在 WebIDE 中打开 if.sh 文件,并将其修改如下:

#!/bin/bash

NAME="Alice"
if [ "$NAME" = "John" ]; then
  echo "The name is John"
else
  echo "The name is not John"
fi

让我们看看有哪些变化:

  1. 我们将 NAME 变量改成了「Alice」。这是为了演示当条件为假时会发生什么。
  2. 我们添加了一个 else 子句。该子句指定了如果 if 语句中的条件不成立时应该执行的操作。
  3. else 之后,我们添加了另一个 echo 命令,当 NAME 不是「John」时,它将运行。

在 if 语句中,else 子句是可选的,但当你希望在条件不满足时执行特定操作(而不是什么都不做)时,它非常有用。

保存修改后的文件。

现在,再次运行脚本:

./if.sh

这一次,你应该看到输出:The name is not John

这是因为 NAME 现在是「Alice」,所以条件 [ "$NAME" = "John" ] 为假,从而执行了 else 块中的代码。

尝试将 NAME 变量改回「John」并再次运行脚本。你会得到什么输出?这是测试 if-else 语句在两种情况下是否都能正常工作的好方法。

引入 Elif

有时,我们需要检查多个条件。这时 elif(即 else if)子句就派上用场了。让我们修改脚本以处理多个名字。

if.sh 文件更新为以下内容:

#!/bin/bash

NAME="George"
if [ "$NAME" = "John" ]; then
  echo "John Lennon"
elif [ "$NAME" = "Paul" ]; then
  echo "Paul McCartney"
elif [ "$NAME" = "George" ]; then
  echo "George Harrison"
elif [ "$NAME" = "Ringo" ]; then
  echo "Ringo Starr"
else
  echo "Unknown member"
fi

让我们分析一下这个脚本:

  1. 我们以 NAME="George" 开始。这是我们要检查的名字。
  2. 第一个 if 语句检查名字是否为「John」。
  3. 如果不是「John」,则进入第一个 elif(else if)语句,检查名字是否为「Paul」。
  4. 如果不是「Paul」,则进入下一个 elif,检查是否为「George」。
  5. 如果不是「George」,则检查是否为「Ringo」。
  6. 如果以上条件都不满足,则进入 else 子句,输出「Unknown member」。

elif 子句允许你按顺序检查多个条件。你可以根据需要添加任意数量的 elif 子句。条件会按顺序被检查,第一个为真的条件将执行其对应的代码块。

保存修改后的文件。

现在,运行脚本:

./if.sh

你应该看到输出:George Harrison

尝试将 NAME 变量更改为不同的值(如「John」、「Paul」、「Ringo」或其他完全不同的内容)并每次运行脚本。观察输出如何根据 NAME 的值而变化。

数值比较

Shell 脚本也可以比较数字。让我们创建一个新脚本来演示数值比较。

创建一个名为 numeric.sh 的新文件:

touch numeric.sh

在 WebIDE 中打开 numeric.sh 并添加以下内容:

#!/bin/bash

NUMBER=10

if [ $NUMBER -lt 5 ]; then
  echo "The number is less than 5"
elif [ $NUMBER -eq 10 ]; then
  echo "The number is exactly 10"
elif [ $NUMBER -gt 15 ]; then
  echo "The number is greater than 15"
else
  echo "The number is between 5 and 15, but not 10"
fi

这个脚本引入了数值比较运算符:

  • -lt:小于(less than)
  • -eq:等于(equal to)
  • -gt:大于(greater than)

你还可以使用其他运算符:

  • -le:小于或等于(less than or equal to)
  • -ge:大于或等于(greater than or equal to)
  • -ne:不等于(not equal to)

请注意,我们使用这些特殊的运算符而不是 <> 符号。这是因为在 Bash 中,<> 用于输入/输出重定向,而不是用于数值比较。

现在,让脚本具有可执行权限并运行它:

chmod +x numeric.sh
./numeric.sh

你应该看到输出:The number is exactly 10

尝试将 NUMBER 变量更改为不同的值并再次运行脚本。观察输出如何根据你设置的值而变化。

例如,如果你将 NUMBER 改为 20,你应该得到「The number is greater than 15」。如果你将其改为 7,你应该得到「The number is between 5 and 15, but not 10」。

字符串比较与逻辑运算符

最后,让我们探索字符串比较和逻辑运算符。创建一个名为 string_logic.sh 的新文件:

touch string_logic.sh

在 WebIDE 中打开 string_logic.sh 并添加以下内容:

#!/bin/bash

STRING1="hello"
STRING2="world"
NUMBER1=5
NUMBER2=10

if [ "$STRING1" = "hello" ] && [ "$STRING2" = "world" ]; then
  echo "Both strings match"
fi

if [ $NUMBER1 -lt 10 ] || [ $NUMBER2 -gt 5 ]; then
  echo "At least one of the number conditions is true"
fi

if [[ "$STRING1" != "$STRING2" ]]; then
  echo "The strings are different"
fi

if [[ -z "$STRING3" ]]; then
  echo "STRING3 is empty or not set"
fi

这个脚本演示了几个新概念:

  1. 字符串相等比较(=):检查两个字符串是否完全相同。
  2. 逻辑与(&&):此运算符允许你组合两个条件。只有当两个条件都为真时,整个表达式才为真。
  3. 逻辑或(||):此运算符也组合两个条件,但只要其中一个条件为真,整个表达式就为真。
  4. 字符串不等比较(!=):检查两个字符串是否不同。
  5. 检查字符串是否为空(-z):如果字符串为空(长度为零),则为真。

另外,请注意在某些 if 语句中使用了双方括号 [[ ]]。这是单方括号的增强版本,在编写 Bash 脚本时通常更推荐使用。它们支持更复杂的表达式,并且在单词拆分(word splitting)和路径名扩展方面更不容易出错。

使脚本具有可执行权限并运行它:

chmod +x string_logic.sh
./string_logic.sh

你应该看到打印出所有四条 echo 语句,因为脚本中的所有条件都为真。

Both strings match
At least one of the number conditions is true
The strings are different
STRING3 is empty or not set

尝试更改一些值(例如将 STRING1 设置为「hello」以外的内容),看看它如何影响输出。

总结

在本实验中,你学习了如何在 Shell 编程中使用条件语句。你练习了使用 if-else 语句、elif 子句、数值比较、字符串比较以及逻辑运算符。这些工具使你能够创建更复杂且基于决策的 Shell 脚本。

关键知识点:

  • Shell 脚本中 if-else 语句的基本结构
  • 如何使用 elif 处理多种条件
  • 数值比较运算符(-lt, -gt, -eq 等)
  • 字符串比较与逻辑运算符
  • 使用 chmod 使脚本具有可执行权限的重要性

请记住,练习是熟练掌握 Shell 脚本编写的关键。尝试以不同的方式创建你自己的脚本来运用这些概念。随着学习的深入,你会发现这些条件语句对于创建更高级和实用的脚本至关重要。