如何使用 Bash If 语句(4 个例子)

已发表: 2023-05-08
Linux 笔记本电脑显示一个终端窗口,背景为地球图案和二进制水印
fatmawati achmad zaenuri/Shutterstock
使用 Linux Bash if 语句构建具有if then fi结构的条件表达式。 为其他条件表达式添加elif关键字,或为定义一个包罗万象的代码部分添加else关键字,如果没有执行先前的条件子句则执行该代码。

所有重要的 Bash 脚本都需要做出决定。 Bash if 语句让您的 Linux 脚本提出问题,并根据答案运行不同的代码部分。 他们是这样工作的。

什么是条件执行?

在除最微不足道的 Bash 脚本之外的所有脚本中,执行流通常需要根据决定的结果在脚本中采用不同的路径。 这称为条件执行。

决定采用哪个执行分支的一种方法是使用if语句。 您可能会听到if语句称为if then语句,或者if then else语句。 它们是同一事物的不同名称。

Linux Bash 脚本中 for 循环的 9 个示例
Linux Bash 脚本中 for 循环的相关9 示例

if语句表示如果某件事为真,则执行操作。 但如果某件事是假的,那就去做吧。 “某物”可以是很多东西,例如变量的值、文件的存在或两个字符串是否匹配。

条件执行对于任何有意义的脚本都是至关重要的。 没有它,您可以让脚本执行的操作非常有限。 除非它可以做出有意义的决定,否则您将无法解决现实世界的问题并产生可行的解决方案。

if语句可能是最常用的获得条件执行的方法。 下面是如何在 Bash 脚本中使用它。

相关:如何检查文件是否存在于 Linux Bash 脚本中

一个简单的 If 语句示例

这是最简单的if语句的规范形式:

 如果 [ 这个条件为真 ]
然后
  执行这些语句
菲

如果文本中的条件解析为真,则执行then子句中的脚本行。 如果您正在查看其他人编写的脚本,您可能会看到这样写的if语句:

 如果 [ 这个条件为真 ]; 然后
  执行这些语句
菲

需要注意的几点:

  • if语句以写fi结束。
  • 条件测试的第一个括号“ [之后和第二个括号“ ]之前必须有一个空格。
  • 如果您打算将then关键字与条件测试放在同一行,请确保使用分号” ; ” 测试后。

如果条件测试被证明为假,我们可以添加一个可选的else子句来执行一些代码。 else子句不需要then关键字。

 如果 [ 这个条件为真 ]
然后
  执行这些语句
别的
  改为执行这些语句
菲

此脚本显示了一个使用else子句的if语句的简单示例。 条件测试检查客户的年龄是否大于或等于 21。如果是,则客户可以进入场所,然后执行then子句。 如果他们不够大,则执行else子句,并且不允许他们进入。

 #!/bin/庆典

customer_age=25

如果 [ $customer_age -ge 21 ]
然后
  echo "进来吧。"
别的
  echo "你不能进来。"
菲

将上面的脚本复制到编辑器中,将其保存为名为“if-age.sh”的文件,然后使用chmod命令使其可执行。 您需要对我们讨论的每个脚本执行此操作。

 chmod +x if-age.sh 

使用 chmod 使脚本可执行

让我们运行我们的脚本。

 ./if-age.sh 

运行年龄变量设置为 25 的 if-age.sh 脚本

现在我们将编辑文件并使用小于 21 岁的年龄。

 customer_age=18

对您的脚本进行更改,并保存您的更改。 如果我们现在运行它,条件返回 false,然后执行 else 子句。

 ./if-age.sh 

运行年龄变量设置为 18 的 if-age.sh 脚本

elif 条款

elif子句添加了额外的条件测试。 您可以拥有任意数量的elif子句。 依次对它们进行评估,直到发现其中一个为真。 如果没有一个elif条件测试证明为真,则执行else子句(如果存在)。

该脚本要求输入一个数字,然后告诉您它是奇数还是偶数。 零是偶数,所以我们不需要测试任何东西。

所有其他数字都通过找到除以二的模数来测试。 在我们的例子中,模数是除以二的结果的小数部分。 如果没有小数部分,则该数字可以被二整除。 因此它是偶数。

 #!/bin/庆典

echo -n "请输入数字:"

读号

如果 [ $number -eq 0 ]
然后
  echo "你输入了零。零是偶数。"
elif [ $(($number % 2)) -eq 0 ]
然后
  echo "您输入了 $number。它是一个偶数。"
别的
  echo "您输入了 $number。它是一个奇数。"
菲

要运行此脚本,请将其复制到编辑器并将其另存为“if-even.sh”,然后使用 chmod 使其可执行。

让我们运行脚本几次并检查其输出。

 ./if-even.sh 

使用各种输入运行 if-even.sh 脚本

这一切都很好。

不同形式的条件测试

我们用于条件测试的方括号“ [] ”是调用test程序的简写方式。 因此, test支持的所有比较和测试都可用于您的if语句。

这只是其中的几个:

  • expression :如果表达式为假,则为真。
  • -n 字符串:如果字符串的长度大于零则为真。
  • -z 字符串:如果字符串的长度为零,则为真。 也就是说,它是一个空字符串。
  • string1 = string2 :如果 string1 与 string2 相同则为真。
  • string1 != string2 :如果 string1 与 string2 不同则为真。
  • integer1 -eq integer2 :如果 integer1 在数值上等于 integer2 则为真
  • integer1 -qt integer2 :如果 integer1 在数值上大于 integer2,则为真
  • integer1 -lt integer2 :如果 integer1 在数值上小于 integer2 则为真
  • -d 目录:如果目录存在则为真。
  • -e 文件:如果文件存在则为真。
  • -s 文件:如果文件存在且大小大于零则为真。
  • -r 文件:如果文件存在并且设置了读取权限则为真。
  • -w 文件:如果文件存在并且设置了写权限则为真。
  • -x 文件:如果文件存在并且设置了执行权限则为真。

在表中,“文件”和“目录”可以包括相对或绝对目录路径。

等号“ = ”和等式检验-eq一样的。 等号执行一个字符一个字符的文本比较。 相等性测试执行数值比较。

我们可以通过在命令行上使用test程序来看到这一点。

 测试“这个字符串”=“这个字符串”
 测试“这个字符串”=“那个字符串”
 测试 1 = 001
 测试 1 -eq 001

在每种情况下,我们都使用echo命令来打印最后一条命令的返回码。 零表示真,一表示假。

在命令行中使用测试程序来测试不同的比较

使用等号“ = ”给我们一个比较 1 和 001 的错误响应。这是正确的,因为它们是两个不同的字符串。 在数字上它们是相同的值——一个——所以-eq运算符返回一个真响应。

如果要在条件测试中使用通配符匹配,请使用双括号“ [[ ]] ”语法。

 #!/bin/庆典

如果 [[ $USER == *ve ]]
然后
  回声“你好$USER”
别的
  echo "$USER 不以 've' 结尾"
菲

此脚本检查当前用户的帐户名。 如果它以“ ve ”结尾,它会打印用户名。 如果它不以“ ve ”结尾,脚本会告诉您,然后结束。

 ./if-wild.sh 

运行 if-wild.sh 脚本,在 if 语句的条件测试中显示通配符搜索

相关: Bash 中的条件测试:if, then, else, elif

嵌套 If 语句

您可以将一个if语句放在另一个if语句中。

这是完全可以接受的,但是嵌套if语句会使代码更难阅读,更难维护。 如果您发现自己嵌套了两层或三层以上的if语句,您可能需要重新组织脚本的逻辑。

下面是一个脚本,它以数字形式获取一天,从一到七。 一是周一,七是周日。

它告诉我们商店的营业时间。 如果是工作日或星期六,它会报告商店营业。 如果是星期天,则报告商店关门。

如果商店开张,则嵌套的if语句进行第二次测试。 如果那天是星期三,它会告诉我们它只在早上开放。

 #!/bin/庆典

# 以数字 1..7 的形式获取日期
天=$(日期+“%u”)

如果 [$day -le 6]
然后
  ##商店开门了
  如果 [ $day -eq 3 ]
  然后
    #周三是半天
    echo "星期三我们只在早上开门。"
  别的
    # 常规工作日和星期六
   echo “我们全天营业。”
  菲
别的
  #周日不营业
  echo "今天是星期天,我们不营业。"
菲

将此脚本复制到编辑器中,将其保存为名为“if-shop.sh”的文件,并使用chmod命令使其可执行。

我们运行脚本一次,然后将计算机的时钟更改为星期三,然后重新运行脚本。 然后我们将这一天更改为星期日并再次运行它。

 ./if-shop.sh
 ./if-shop.sh
 ./if-shop.sh 

运行 if-shop.sh 脚本,计算机时钟设置为工作日,然后是星期三,然后是星期日

相关:如何在 Linux 中使用双括号条件测试

案例 For if

条件执行为编程和脚本编写带来了力量,不起眼的if语句很可能是在代码中切换执行路径的最常用方法。 但这并不意味着它总是答案。

编写好的代码意味着知道您有哪些选择以及哪些是解决特定需求的最佳选择。 if语句很棒,但不要让它成为你包里的唯一工具。 特别是,查看case语句,它在某些情况下可以作为解决方案。

相关:如何在 Bash 脚本中使用 Case 语句