Shell 中的条件语句

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("`Linux`")) -.-> linux/BasicSystemCommandsGroup(["`Basic System Commands`"]) shell(("`Shell`")) -.-> shell/BasicSyntaxandStructureGroup(["`Basic Syntax and Structure`"]) shell(("`Shell`")) -.-> shell/VariableHandlingGroup(["`Variable Handling`"]) linux(("`Linux`")) -.-> linux/BasicFileOperationsGroup(["`Basic File Operations`"]) linux(("`Linux`")) -.-> linux/FileandDirectoryManagementGroup(["`File and Directory Management`"]) shell(("`Shell`")) -.-> shell/ControlFlowGroup(["`Control Flow`"]) linux/BasicSystemCommandsGroup -.-> linux/echo("`Text Display`") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("`Shebang`") shell/BasicSyntaxandStructureGroup -.-> shell/comments("`Comments`") linux/BasicSystemCommandsGroup -.-> linux/logical("`Logic Operations`") shell/VariableHandlingGroup -.-> shell/variables_decl("`Variable Declaration`") shell/VariableHandlingGroup -.-> shell/variables_usage("`Variable Usage`") linux/BasicFileOperationsGroup -.-> linux/chmod("`Permission Modifying`") linux/FileandDirectoryManagementGroup -.-> linux/cd("`Directory Changing`") shell/ControlFlowGroup -.-> shell/if_else("`If-Else Statements`") subgraph Lab Skills linux/echo -.-> lab-388815{{"`Shell 中的条件语句`"}} shell/shebang -.-> lab-388815{{"`Shell 中的条件语句`"}} shell/comments -.-> lab-388815{{"`Shell 中的条件语句`"}} linux/logical -.-> lab-388815{{"`Shell 中的条件语句`"}} shell/variables_decl -.-> lab-388815{{"`Shell 中的条件语句`"}} shell/variables_usage -.-> lab-388815{{"`Shell 中的条件语句`"}} linux/chmod -.-> lab-388815{{"`Shell 中的条件语句`"}} linux/cd -.-> lab-388815{{"`Shell 中的条件语句`"}} shell/if_else -.-> lab-388815{{"`Shell 中的条件语句`"}} end

创建你的第一个 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":如果条件为真,这行代码将被执行。
  5. fi:这标志着 if 语句的结束。它是 "if" 的倒写!

添加完内容后保存文件。

现在,我们需要使脚本可执行。在类 Unix 系统中,出于安全原因,文件默认是不可执行的。我们可以使用 chmod 命令来更改这一点:

chmod +x if.sh

该命令为文件添加了执行权限。+x 表示 "添加执行权限"。

现在,运行脚本:

./if.sh

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

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

如果没有看到此输出,请仔细检查你是否已正确保存文件内容,并确保已将其设置为可执行。

添加 Else 子句

现在,让我们扩展 if 语句以包含一个 else 子句。这允许我们指定当条件为假时应该发生什么。

再次在 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",该命令将会运行。

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

保存这些更改后的文件。

现在,再次运行脚本:

./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:小于
  • -eq:等于
  • -gt:大于

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

  • -le:小于或等于
  • -ge:大于或等于
  • -ne:不等于

注意,我们使用这些特殊运算符而不是像 <> 这样的符号。这是因为在 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. 逻辑 AND (&&):该运算符允许你组合两个条件。两个条件都必须为真,整个表达式才为真。
  3. 逻辑 OR (||):该运算符也组合两个条件,但只需要其中一个为真,整个表达式就为真。
  4. 字符串不等比较 (!=):检查两个字符串是否不同。
  5. 检查字符串是否为空 (-z):如果字符串为空(长度为零),则为真。

此外,注意在某些 if 语句中使用了双括号 [[ ]]。这是单括号的增强版本,在 Bash 脚本中尽可能优先使用。它们允许更复杂的表达式,并且在词分割和路径名扩展方面更少出现意外情况。

使脚本可执行并运行它:

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 脚本的关键。尝试创建自己的脚本,以不同的方式使用这些概念。随着你的进步,你会发现这些条件语句对于创建更复杂和实用的脚本至关重要。

您可能感兴趣的其他 Linux 教程