简介
在本实验中,你将学习如何在 shell 编程中使用条件语句来进行逻辑判断。我们将涵盖 if-else 语句的基本语法,以及如何使用数值和字符串比较来评估条件。通过本实验的学习,你将能够编写能够根据各种条件做出决策的 shell 脚本。
在本实验中,你将学习如何在 shell 编程中使用条件语句来进行逻辑判断。我们将涵盖 if-else 语句的基本语法,以及如何使用数值和字符串比较来评估条件。通过本实验的学习,你将能够编写能够根据各种条件做出决策的 shell 脚本。
让我们从创建一个简单的 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
让我们分解一下这个脚本:
#!/bin/bash
:这被称为 "shebang" 行。它告诉系统使用哪个解释器来运行脚本。在这里,我们使用的是 Bash。NAME="John"
:这行代码创建了一个名为 NAME
的变量,并将其赋值为 "John"。if [ "$NAME" = "John" ]; then
:这是 if 语句的开始。它检查 NAME
的值是否等于 "John"。
[ ]
实际上是 Bash 中的一个命令,等同于 test
命令。"$NAME"
放在引号中,以处理 NAME
可能为空或包含空格的情况。then
是 Bash 中 if 语句语法的一部分。echo "The name is John"
:如果条件为真,这行代码将被执行。fi
:这标志着 if 语句的结束。它是 "if" 的倒写!添加完内容后保存文件。
现在,我们需要使脚本可执行。在类 Unix 系统中,出于安全原因,文件默认是不可执行的。我们可以使用 chmod
命令来更改这一点:
chmod +x if.sh
该命令为文件添加了执行权限。+x
表示 "添加执行权限"。
现在,运行脚本:
./if.sh
./
告诉 shell 在当前目录中查找脚本。
你应该会看到输出:The name is John
如果没有看到此输出,请仔细检查你是否已正确保存文件内容,并确保已将其设置为可执行。
现在,让我们扩展 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
让我们来看看这些变化:
NAME
变量更改为 "Alice"。这是为了演示当条件为假时会发生什么。else
子句。该子句指定了如果 if 语句中的条件为假时应该发生什么。else
之后,我们添加了另一个 echo
命令,如果 NAME
不是 "John",该命令将会运行。else
子句在 if 语句中是可选的,但当你希望在条件为假时执行某些特定操作而不是什么都不做时,它非常有用。
保存这些更改后的文件。
现在,再次运行脚本:
./if.sh
这次,你应该会看到输出:The name is not John
这是因为 NAME
现在是 "Alice",所以条件 [ "$NAME" = "John" ]
为假,else
块中的代码被执行。
尝试将 NAME
变量改回 "John" 并再次运行脚本。你会得到什么输出?这是测试你的 if-else 语句在两种情况下是否正常工作的好方法。
有时,我们需要检查多个条件。这时 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
让我们分解一下这个脚本:
NAME="George"
开始。这是我们要检查的名字。if
语句检查名字是否为 "John"。elif
(else if)语句,检查名字是否为 "Paul"。elif
,检查是否为 "George"。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
该脚本展示了几个新概念:
=
):检查两个字符串是否完全相同。&&
):该运算符允许你组合两个条件。两个条件都必须为真,整个表达式才为真。||
):该运算符也组合两个条件,但只需要其中一个为真,整个表达式就为真。!=
):检查两个字符串是否不同。-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 脚本。
关键要点:
chmod
使脚本可执行的重要性记住,练习是熟练掌握 shell 脚本的关键。尝试创建自己的脚本,以不同的方式使用这些概念。随着你的进步,你会发现这些条件语句对于创建更复杂和实用的脚本至关重要。