Bash if..else语句

时间:2020-03-05 15:31:37  来源:igfitidea点击:

在本教程中,我们将向您介绍bashif语句的基本知识,并向您展示如何在shell脚本中使用它。

决策是计算机程序设计中最基本的概念之一。
与任何其他编程语言一样,Bash中的if、if..else、if..elif..else和嵌套if语句可用于根据特定条件执行代码。

if语句

Bash if条件句可以有不同的形式。
最基本的if语句采用以下形式:

if TEST-COMMAND
then
  STATEMENTS
fi

if语句以if关键字开头,后跟条件表达式和then关键字。
语句以fi关键字结束。

如果TEST-COMMAND的计算结果为True,则执行语句。
如果TEST-COMMAND返回False,则不会发生任何情况,语句将被忽略。

通常,总是缩进代码并用空行分隔代码块是一个很好的实践。
大多数人选择使用4空格或者2空格缩进。
缩进和空行使代码更具可读性和组织性。

让我们看看下面的示例脚本,它检查给定的数字是否大于10:

#!/bin/bash

echo -n "Enter a number: "
read VAR

if [[ $VAR -gt 10 ]]
then
  echo "The variable is greater than 10."
fi

将代码保存在文件中并从命令行运行:

bash test.sh

脚本将提示您输入一个数字。
例如,如果输入15,test命令的计算结果将为true,因为15大于10,然后将执行then子句中的echo命令。

The variable is greater than 10.

if..else语句

Bash if..else语句采用以下形式:

if TEST-COMMAND
then
  STATEMENTS1
else
  STATEMENTS2
fi

如果TEST-COMMAND的计算结果为True,则将执行语句1。
否则,如果TEST-COMMAND返回False,则将执行语句2。
语句中只能有一个else子句。

让我们在前面的示例脚本中添加一个else子句:

#!/bin/bash

echo -n "Enter a number: "
read VAR

if [[ $VAR -gt 10 ]]
then
  echo "The variable is greater than 10."
else
  echo "The variable is equal or less than 10."
fi

如果运行代码并输入数字,脚本将根据数字是大于还是小于/等于10打印不同的消息。

if..elif..else语句

Bash if..elif..else语句采用以下形式:

if TEST-COMMAND1
then
  STATEMENTS1
elif TEST-COMMAND2
then
  STATEMENTS2
else
  STATEMENTS3
fi

如果TEST-COMMAND1的计算结果为True,则将执行语句1。
如果TEST-COMMAND2的计算结果为True,则将执行语句2。
如果没有一个测试命令的计算结果为True,则执行语句2。

语句中可以有一个或者多个elif子句。
else子句是可选的。

条件按顺序计算。
如果剩余的条件未执行,则返回控制项的结束条件。

让我们在前面的脚本中添加一个elif子句:

#!/bin/bash

echo -n "Enter a number: "
read VAR

if [[ $VAR -gt 10 ]]
then
  echo "The variable is greater than 10."
elif [[ $VAR -eq 10 ]]
then
  echo "The variable is equal to 10."
else
  echo "The variable is less than 10."
fi

嵌套if语句

Bash允许您在if语句中嵌套if语句。
可以将多个if语句放在另一个if语句中。

下面的脚本将提示您输入三个数字,并将打印三个数字中最大的一个。

#!/bin/bash

echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3

if [[ $VAR1 -ge $VAR2 ]]
then
  if [[ $VAR1 -ge $VAR3 ]]
  then
    echo "$VAR1 is the largest number."
  else
    echo "$VAR3 is the largest number."
  fi
else
  if [[ $VAR2 -ge $VAR3 ]]
  then
    echo "$VAR2 is the largest number."
  else
    echo "$VAR3 is the largest number."
  fi
fi

输出结果如下:

Enter the first number: 4
Enter the second number: 7
Enter the third number: 2
7 is the largest number.

多重条件

逻辑OR和and运算符允许您在if语句中使用多个条件。

这是另一个版本的脚本,打印三个数字中最大的一个。
在这个版本中,我们使用逻辑AND(&&)运算符,而不是嵌套的if语句。

#!/bin/bash

echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3

if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]]
then
  echo "$VAR1 is the largest number."
elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]]
then
  echo "$VAR2 is the largest number."
else
  echo "$VAR3 is the largest number."
fi

测试运算符

在Bash中,test命令采用以下语法形式之一:

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

为了使脚本可移植,最好使用旧的test[,该命令在所有POSIX shell上都可用。
大多数使用Bash、Zsh和Ksh作为默认shell的现代系统都支持est [[(双括号)的新升级版本。
(
要对测试表达式求反,请使用逻辑NOT(!)运算符。
比较字符串时,请始终使用单引号或者双引号,以避免分词和通配符问题。

以下是一些最常用的运算符:

  • -n VAR-如果VAR的长度大于零,则为True。

  • -z VAR-如果变量为空,则为True。

  • STRING1=STRING2-如果STRING1和STRING2相等,则为True。

  • STRING1!=STRING2-如果STRING1和STRING2不相等,则为True。

  • INTEGER1-eq INTEGER2-如果INTEGER1和INTEGER2相等,则为True。

  • INTEGER1-gt INTEGER2-如果INTEGER1大于INTEGER2,则为True。

  • INTEGER1-lt INTEGER2-如果INTEGER1小于INTEGER2,则为True。

  • INTEGER1-ge INTEGER2-如果INTEGER1等于或者大于INTEGER2,则为True。

  • INTEGER1-le INTEGER2-如果INTEGER1等于或者小于INTEGER2,则为True。

  • -h FILE-如果文件存在并且是符号链接,则为True。

  • -r FILE-如果文件存在且可读,则为True。

  • -w FILE-如果文件存在且可写,则为True。

  • -x文件-如果文件存在且可执行,则为True。

  • -d FILE-如果文件存在并且是一个目录,则为True。

  • -e FILE—如果文件存在并且是文件,则为True,而不考虑类型(节点、目录、套接字等)。

  • -f FILE—如果文件存在并且是常规文件(不是目录或者设备),则为True。