Bash 脚本 – 条件语句

在本指南中,我们将通过示例了解 Bash 脚本中条件语句的用法。 决策是编程中的一个重要步骤。 可能存在必须满足某些条件并基于此您必须编写一些逻辑的情况。 这就是条件语句的作用。 条件语句允许您编写逻辑并做出决定。 您在此处阅读的概念对于所有编程语言都是相同的,但语法和实现有所不同。

条件语句语法

条件语句的构建块 bash 如下。

if [[ conditions ]]
then
   code
elif [[ conditions ]]
then
   code
else
   code
fi

代码说明:

  1. 关键词 "if""fi" 标记条件语句的开始和结束。 每个 if 语句后面都应该跟 "then" 关键词。
  2. 任何一个 [[ ]] 或者 [ ] 应该用于评估条件。 如果条件被评估为 “真的”,然后将执行一段代码。
  3. 条件语句可以有一个 if 条件和多个 elif 条件。 如果某个条件被评估为真,则所有后续条件语句都将被跳过。
  4. 如果所有的 if 或者 elif 块被评估为 错误的 然后是代码块 "else" 子句将运行。
  5. 虽然没有严格的缩进规则,但为代码块留出 2 个空格,这样可以提高可读性。

评估条件 bash 有一个名为的内置命令 "test". 方括号与测试命令相同,因此您可以使用测试命令或方括号。

$ type -a test
test is a shell builtin
test is /usr/bin/test
test is /bin/test

有一堆运营商支持 test 命令来评估条件,我们将在接下来的部分中看到如何使用这些运算符。 要获取运算符列表,您可以运行以下任一命令。

$ man test
$ help test

文件测试运算符

文件测试 运营商 可用于处理文件或目录对象。 使用文件测试运算符,您可以验证给定文件或目录是否存在,给定对象是文件或目录,您正在处理的文件类型,文件大小等。运行以下命令并注意文件操作符部分。

$ man test
文件测试操作员

并非所有运算符都经常使用,但我将引导您了解最重要的运算符。

要检查给定文件是否存在,请使用 -e 旗帜。 在这里,我正在检查是否 .bashrc 文件是否存在于我的主目录中。

if [[ -e /home/${USER}/.bashrc ]]
then
  echo "File is present"
else
  echo "File is not present"
fi
检查文件是否存在

要检查给定目录是否存在,请使用 -d 旗帜。 在这里,我正在检查 桌面 我的主文件夹中的目录。

if [[ -d ~/Desktop/ ]]
then
  echo "Directory is present"
else
  echo "Directory is not present"
fi
检查目录是否存在检查目录是否存在

检查文件是否为 非零大小 文件,使用 -s 旗帜。 在这里,我创建了一个名为 "zero_byte.txt" 并附加了一些文字。

$ touch ~/Desktop/zero_byte.txt
$ echo "Writing something" >> ~/Desktop/zero_byte.txt
$ if [[ -s ~/Desktop/zero_byte.txt ]]
then
  echo "File is not zero byte"
else
  echo "File is zero byte"
fi
检查文件是否为零字节检查文件是否为零字节

您可以使用 ! 带有任何标志的符号将反转结果。 我正在使用相同的 example 如上所述,但有 "!" 象征。 它会将文件反转并打印为零字节文件,即使它不是。

$ if [[ ! -s ~/Desktop/zero_byte.txt ]]
then
  echo "File is not zero byte"
else
  echo "File is zero byte"
fi
逆运算逆运算

整数比较运算符

下面是整数比较运算符,它们将针对两个给定的整数进行评估。

-eq => Integer X is equal to Integer Y
-ne => Integer X is not equal to Integer Y
-gt => Integer X is greater than Integer Y
-ge => Integer X is greater than or equal to Integer Y
-lt => Integer X is lesser than Integer Y
-le => Integer X is lesser than or equal to Integer Y

每一个 bash 命令返回之间的退出代码 0-255 我们将使用整数比较运算符来评估退出代码。 在下面 example,我正在分配的退出代码 非虚拟机 命令到一个名为的变量 EXCODE 并进行整数比较。 由于 neovim 不可用,它会抛出 退出代码 127 (命令未找到错误)。

$ EXCODE=$(nvim;echo $?)
$ if [[ $EXCODE -eq 0 ]]
then      
  echo "nvim is available to use"
elif [[ $EXCODE -eq 127 ]]
then
  echo "Command not found, check if nvim is installed or not"
else     
   echo "Return code is other than 0 & 127. Check and fix the error"
fi
整数比较 example整数比较 example

在上述 example我用过 elif 声明为本文中的第一个声明。 首先是 "if" 评估条件以检查返回代码是否为零,返回 false,然后将控制权传递给 elif 语句和条件被评估为真并运行代码块。 你可以添加尽可能多 elif 语句来评估不同的条件。

您还可以一次评估多个条件 if 或者 elif 使用逻辑 AND、OR 运算符的语句。

LOGICAL AND ⇒ && symbol => All the conditions should be evaluated to be true.
LOGICAL OR ⇒ || symbol => Anyone condition should be evaluated to be true.

下面是一个 example 对于一个合乎逻辑的 将整数存储在变量中的运算符 X 被评估为 真的.

$ X=10
$ Y=15
$ if [[ $X -eq 10 && $Y -eq 15 ]]
then
  echo "ok to proceed"
else
  echo "Not ok to proceed"
fi
逻辑与运算符的使用逻辑与运算符的使用

下面是 example 对于一个合乎逻辑的 或者 运算符 where 变量 X 被评估为 真的 和变量 被评估为 错误的.

$ X=10
$ Y=15
$ if [[ $X -eq 10 || $Y -eq 10 ]]
then
  echo "ok to proceed"
else
  echo "Not ok to proceed"
fi
逻辑或运算符的使用逻辑或运算符的使用

紧凑的条件语句

如果你只需要写一个 ifelse 语句,那么您可以使用速记方式。 简而言之,没有必要使用 if..then..else..fi 关键字。 您可以使用逻辑 AND (&&) 和逻辑或 (||) 运算符。

[[ condition ]] && << run if condition is evaluated to true >> || << run if condition is evaluated to false >>

看看下面 example. 我正在尝试检查包裹 新取 可用,如果不可用,请尝试安装它。

$ which neofetch && echo "Neofetch already installed" || sudo apt install neofetch -y
紧凑的逻辑表达式 example紧凑的逻辑表达式 example

代码说明:

  • 它将运行 "which neofetch" 命令,如果返回码为零,那么后面的任何内容 && 运营商将运行。
  • 如果返回码大于零(评估为假),则后面的任何内容 || 运营商将运行。
  • 这类似于 ifelse 陈述。 这 "If" 只有当条件被评估为真时,语句才会运行。 在这种情况下,它是 操作员。 类似地,else 子句仅在以下情况下运行 "if" 条件被评估为假。 在这种情况下,它是 或者 操作员。
  • 在我的机器中已经安装了 neofetch,因此退出代码将为零。 它将运行 echo 命令。 如果没有安装 neofetch,它将运行 apt install 命令。

下面是另一个 example 我正在使用文件测试运算符来检查文件是否为零字节。

$ [[ -s ~/.bashrc ]] && echo "Not a empty file" || echo "Empty file"
紧凑逻辑表达式测试运算符紧凑逻辑表达式测试运算符

字符串比较运算符

整数文件 测试操作符,我们有一组操作符来处理字符串。 下面是一组重要的字符串运算符。

-z => Check if string is NULL.
-n => Check if string is not NULL.
== => Check for string equality.
!= => Check for string inequality.

要检查字符串是否为 NULL,请使用 -z-n 旗帜。 我正在使用紧凑的条件语句语法来评估条件。

$ [[ -z "Howdy" ]] && echo "String is NULL" || echo "String is not NULL"
$ [[ -n "Howdy" ]] && echo "String is not NULL" || echo "String is NULL"
字符串是否为空字符串是否为空

要检查两个字符串是否相等,请使用 == 操作员。 字符串区分大小写,因此您必须牢记这一点来运行比较。

$ X="Linux"
$ Y="Linux"
$ [[ $X == $Y ]] && echo "Equal" || echo "Not equal"
字符串相等字符串相等

要检查两个字符串是否不相等,请使用 != 操作员。

$ [[ $X != $Y ]] && echo "Not Equal" || echo "Equal"
不等于运算符

结论

在本文中,我们了解了如何使用条件语句 bash. 我们还看到了如何使用文件测试、整数和字符串运算符。 最后,我们通过示例讨论了如何使用逻辑 AND 和逻辑 OR 运算符编写紧凑的条件语句。

对于任何反馈或建议,请使用评论部分,我们很乐意回复。