理解Bash的if-else语句和其他条件语句

编写 Bourne Again Shell(Bash)脚本可能是一种令人满足的体验,特别是当您为其添加逻辑以确保其健壮性时。通过使用条件语句,特别是“bash if else”,可以将这种逻辑融入其中,使您的脚本更智能。

在这次深入挖掘中,您将掌握 Bash if-else 和 case 语句的强大和细微之处。这将帮助您编写无错误、智能的 Bash 脚本。我们还将添加一些最佳实践,以确保您像专业人士一样编写脚本。

兴奋吗?开始吧,提升您的 Bash 脚本技能吧!

铺垫:前提条件

为了充分利用本教程,您应该具备一些基本条件:

  • A Linux or Windows system armed with Bash. For those on Windows, the Windows Subsystem for Linux (WSL) is your best bet.
  • A code/text editor to write and refine your ‘bash if else’ scripts.

为什么要利用 bash if else 语句?

为什么条件语句在 Bash 脚本中备受推崇?简单来说,它们使您的脚本能够根据预定义条件做出决策。

例如,您可以使用“bash if else”来验证文件是否存在,然后再尝试删除它。或者,您可能想要查看用户在访问资源之前是否具有必要的权限。

将脚本与“bash if else”结构结合不仅增强了其灵活性,还增强了其效力。想象一下设计用于清理文件夹中所有文件的脚本。使用“bash if else”,您可以有选择性地仅删除那些超过30天的文件,保留其他文件。

深入了解“bash if else”语句

现在,让我们抛开介绍,开始动手实践。我们将从最广泛接受的条件语句之一开始:’bash if else’语句。

在其核心,“bash if else”是将条件插入到您的Bash脚本中的入口。请看下面的优雅语法:

  • 它以if关键字开头,后跟[[ ]]中封装的条件。随后执行‘bash if else’语句中的代码,并以fi关键字结束。
  • then关键字将条件与满足条件时执行的操作(或语句)分隔开来。此操作块可以跨越多行,以分号(;)分隔。
if [[ condition ]]; then
	statement
fi

想象一下编写登录系统的脚本。它会在授权之前提示输入正确的用户名:

1. 启动终端并使用您喜欢的文本编辑器创建一个新的bash_if_demo.sh文件。这将是我们理解“bash if else”语句的场所。

nano bash_if_demo.sh

2. 将下面提供的“bash if else”示例嵌入到您的 bash_if_demo.sh 文件中。插入后,保存修改并退出编辑器。

示例的“bash if else”脚本会提示输入用户名。如果输入了预期的用户名,将显示一个欢迎消息,并附带当前日期和时间。

保留用户访问尝试的日期和时间记录对于未来的分析非常有价值。

开头的一行 #!/bin/bash(通常称为 shebang)指示系统使用哪个解释器来处理脚本中的后续代码。这里我们选择了“bash”作为解释器。

#!/bin/bash
# 在屏幕上打印一个问题。
echo "Whats your name?"
# 捕获键盘输入,并将其存储在 $NAME 变量中
read NAME
# 开始 'bash if else' 语句 - 检查 $NAME 变量中的值
# 是否与 "ATA" 匹配。如果匹配,执行括号内的代码。否则跳过。
if [ $NAME == "ATA" ]
then
  # 仅当 $NAME 变量的值等于 "ATA" 时显示一条消息。
  echo "Welcome back ATA!"
fi
# 在 'bash if else' 之外,始终显示当前日期和时间。
date

3. 现在,让我们测试一下我们的“bash if else”脚本。执行以下命令:

bash bash_if_demo.sh

请注意,无论您使用哪个Bash shell变体,都要在脚本名称前加上‘bash’。这确保系统利用Bash执行脚本。

输入“ATA”并按Enter键。结果应类似于以下内容:

Demonstration of the bash_if_demo.sh ‘bash if else’ Script

如果您输入的不是“ATA”,则欢迎消息将不会出现在输出中。只会展示当前日期和时间。这是由‘bash if else’语句引起的,该语句检查$NAME变量的值是否与特定值完全匹配。

请注意,‘bash if else’语句区分大小写。因此,“ata”,“aTa”,“Ata”等都与“ATA”不同。

Outcome on Entering a Non-matching Value

始终使用各种输入测试您的‘bash if else’脚本。这确保脚本按预期运行。

深入了解:嵌套的‘bash if else’语句

您已经掌握了制作‘bash if else’语句的基础知识。虽然这些基础知识足以处理简单的任务,但复杂的脚本通常需要高级结构。这就是嵌套‘bash if else’语句发挥作用的地方。基本上,它是一个包含一个或多个额外‘if’语句的‘if’语句。

以下结构说明了嵌套‘bash if else’语句的基本语法。在这里,外部if [[ conditions ]]子句包含仅在条件满足时可执行的代码。在我们的上下文中,嵌套代码是另一个‘if’语句。

  • if [[ conditions ]] – 这表示外部的 ‘bash if else’ 语句。嵌套的代码(另一个 ‘if’ 语句)仅在所述条件为真时执行。
  • if [[ condition2 ]] – 这表示内部的 ‘bash if else’ 子句。它包含只有在两个条件都满足时才执行的代码。
if [[ conditions ]]; then
	if [[ condition2 ]]; then
		statement
	fi
fi

让我们深入了解。在加强我们之前的 ‘bash if else’ 示例时,我们现在将包括一个询问密码的 if 语句:

1. 首先,使用您喜欢的文本编辑器创建一个名为 bash_nested_if_demo.sh 的新文件。

nano bash_nested_if_demo.sh

2. 将下面提供的 ‘bash if else’ 代码转移到 bash_nested_if_demo.sh 文件中,保存更改并关闭编辑器。

这个 ‘bash if else’ 代码会提示输入姓名和密码。如果姓名和密码的条件匹配,将显示特定的消息。如果没有匹配,输出只显示当前日期和时间。

#!/bin/bash
# 提出提示,要求输入用户名。
echo "Whats your name?"
# 收集用户输入。
read NAME
# 启动 'bash if else' 语句,验证 $NAME 是否匹配 "ATA"。
if [ $NAME == "ATA" ]
 then
 # 提出后续问题,这次是密码。
 echo "Password?"
 # 捕获密码输入。
 read Password
   # 嵌套 'bash if else' - 确定 $Password 是否与 "pwd123" 相对应。
   if [ "$Password" == "pwd123" ]; then
     # 如果关于用户名和密码的两个条件都满足,则显示消息。
     echo "You've successfully logged in as ATA."
   fi
fi
# 强调当前日期和时间。
date

3. 现在,让我们看看这个 ‘bash if else’ 脚本的实际运行情况。运行以下命令:

bash bash_nested_if_demo.sh

为了获得最佳结果,请将用户名输入为 ATA,密码输入为 pwd123

Demonstrating the bash_nested_if_demo.sh Script in action

如果您的输入与“ATA”或“pwd123”不符,您将只收到与当前日期和时间有关的反馈。这是因为 ‘bash if else’ 结构需要满足两个条件。

Validating if entered conditions are met using ‘bash if else’

解读 ‘Bash If Else’ 语句

‘Bash if else’ 语句是Bash脚本的基石,为您的脚本提供决定性的能力。然而,重要的是要理解使用 ‘if’ 语句并非没有缺点。

挑战在于过度依赖‘if’可能使您的代码混乱,变得繁琐和具有挑战性,尤其是当多个嵌套的‘if’语句出现时。这样的脚本可能变成“意大利面代码”,特点是可读性降低,复杂性增加。

那么,如何简化您的‘bash if else’脚本以保持易懂呢?选择‘if else’语句而不是一堆嵌套的‘if’。‘else’关键字提供了一种方便的方式,即在‘if’条件未满足时执行一段代码块。

为了更清晰地了解,考虑下面的‘Bash If Else’语法,其中:

  • if [[ conditions ]] – 这里,‘bash if else’语句包括只有在所述条件有效时触发的代码(statement1)。
  • else – 这是‘bash if else’结构的一部分。else语句包含在前述if子句中的条件不满足时执行的代码(statement2)。
if [[ conditions ]]; then
	statement1
else
	statement2
fi

想象一下创建一个简单的‘bash if else’游戏,其中系统期望从用户获取一个随机数:

1.首先创建一个名为bash_if_else_demo.sh的新文件。

nano bash_if_else_demo.sh

2.将随后的‘bash if else’代码集成到您的bash_if_else_demo.sh文件中,保存修改,然后退出。

底层的‘bash if else’代码提示用户输入他们的幸运数字。如果输入是偶数,则显示‘You Won!’消息。相反,奇数触发‘You Lost!’输出。

#!/bin/bash
广播请求用户的幸运数字
echo -n "Input Your Lucky Number:"
接受输入的数字。
read var
'bash if else'条件来确定值是否为偶数。
if [ $((var%2)) == 0 ]; then
 如果条件满足则宣布获胜
 echo "You Won with 'bash if else'!"
else
 如果条件不满足则宣布失败
 echo "You Lost using 'bash if else'!"
fi

3. 要查看’bash if else’脚本的运行情况,请运行以下命令:

bash bash_if_else_demo.sh

输入偶数时,应该会看到“您赢得了 ‘bash if else’!”的消息。相反,输入奇数应该会得到“您输掉了 ‘bash if else’!”的反馈。

Run the ‘bash if else’ game, bash_if_else_demo.sh Script

为了丰富 ‘bash if else’ 脚本,请考虑添加一个部分来确定用户输入的是字母还是不同的字符而不是数字。

解码 ‘Bash If Else’ 和 Case 语句

到目前为止,您已经探索了几种在Bash脚本中做决定的方法,即 ‘bash if else’ 语句。但是Bash提供了另一种决策的途径-case语句。

与 ‘bash if else’ 类似,case 语句擅长根据指定的条件来规定要执行的代码序列。与嵌套的 ‘bash if else’ 情况相比,case语句的显著优势在于其简洁性和清晰度。

为了充分掌握“bash if else”的替代方案,让我们深入了解case语句的语法:

  • case $VAR in – 这个case结构的部分会对$VAR变量与定义的模式进行匹配,直到找到匹配项。
  • pattern1)pattern2) – 这些是要测试的标准,一旦检测到匹配项,相应的代码(statement1statement2)就会执行。
  • esac – 结束case结构。
case $VAR in
pattern1)
    statement1
    ;;
pattern2)
    statement2
    ;;
esac

想象一下,您正在设计一个“bash if else”脚本,用户输入他们的国家名称,脚本会显示该国的主要语言。

1. 首先创建一个名为bash_case_demo.sh的文件。

nano bash_case_demo.sh

2. 将下面提供的“bash if else”代码整合到您的bash_case_demo.sh文件中,然后保存并退出。

随后的“bash if else”脚本将提示用户输入他们国家的名称,并根据“case”模式打印出所述国家使用的主要语言。

3#!/bin/bash
# 询问用户所在国家的查询
echo -n "In which country do you reside?"
# 获取用户的回答
read var
# 根据'case'框架中的模式,显示用户选择的国家($var)的标准语言
# 'bash if else' case语句评估用户输入($var)是否与模式匹配
echo -n "The official language of $var is "

# 建立揭示用户选择国家的主要语言的模式
case $var in
# 通过使用以下命令,亲自体验这个'bash if else'脚本:
 US)
  echo -n "English"
  ;;

 Canada)
  echo -n "English and French"
  ;;

 Algeria | Bahrain | Egypt| Jordan)
  echo -n "Arabic"
  ;;

 *)
  echo -n "unknown"
  ;;
esac

3. 使用以下命令体验这个’bash if else’脚本:

bash bash_case_demo.sh

你将看到脚本根据用户选择的国家准确显示语言。

如果提供的国家与规定的模式不匹配,则会触发默认(*)模式,输出”unknown”。

Illustrating the functionality of the bash_case_demo.sh Script

总结Bash条件语句

通过本指南,你已经开始了解’bash if else’和Bash中的其他条件语句。从简单的’if’语句到复杂的’if-else’和’case’语句,现在你掌握了有效Bash脚本编写的基本工具。

掌握了这些’bash if else’的基础知识后,你可以更熟练地编写Bash脚本,减少错误的可能性。

但请记住,这仅仅是冰山一角。Bash提供了大量的条件语句。也许,考虑深入研究Bash elif语句&&、OR和||运算符,以获取更深入的见解。通过专注,掌握Bash脚本编写将很快变得可行!

Source:
https://adamtheautomator.com/bash-if-else/