Bash if...else 语句

评论 0 浏览 0 2019-05-29

本教程将指导你学习Bash if语句的基本知识,并向你展示如何在你的shell脚本中使用它。

决策是计算机编程中最基本的概念之一。像其他编程语言一样,Bash中的ifif..elseif..elif..else和嵌套的if语句被用来根据某个条件执行代码。

if 语句

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

if TEST-COMMAND
then
  STATEMENTS
fi

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

如果TEST-COMMAND的值是True,则STATEMENTS被执行。如果TEST-COMMAND返回False,什么也不会发生,STATEMENTS被忽略。

一般来说,缩进你的代码和用空行分隔代码块是一个好的做法。大多数人选择使用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,则STATEMENTS1将被执行。否则,如果TEST-COMMAND返回FalseSTATEMENTS2将被执行。在语句中,你只能有一个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评估为TrueSTATEMENTS1将被执行。如果TEST-COMMAND2评估为TrueSTATEMENTS2将被执行。如果没有一个测试命令评估为True,则STATEMENTS3将被执行。

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

这些条件是按顺序评估的。一旦一个条件返回True,其余的条件就不会被执行,程序控制就会转移到if语句的末尾。

让我们在前面的脚本中添加一个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.

一般来说,使用case语句而不是嵌套的if语句会更有效率。

多种条件

逻辑上的ORAND运算符允许你在if语句中使用多个条件。

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

#!/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

test 命令

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

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

为了使脚本具有可移植性,最好使用旧的测试[命令,它在所有的POSIX shell上都可以使用。新的升级版的test命令[[(双括号)在大多数使用Bash、Zsh和Ksh作为默认shell的现代系统上都支持。

要否定测试表达式,请使用逻辑NOT!)运算符。当比较字符串时,总是使用单引号或双引号,以避免单词分割和通配符问题。

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

  • -n VAR - 如果VAR的长度大于0,则为真。
  • -z VAR - 如果VAR是空的,则为真。
  • STRING1 = STRING2 - 如果 STRING1STRING2 相等,则为真。
  • STRING1 != STRING2 - 如果STRING1STRING2不相等,则为真。
  • INTEGER1 -eq INTEGER2 - 如果 INTEGER1INTEGER2 相等,则为真。
  • INTEGER1 -gt INTEGER2 - 如果INTEGER1大于INTEGER2,则为真。
  • INTEGER1 -lt INTEGER2 - 如果INTEGER1小于INTEGER2,则为真。
  • INTEGER1 -ge INTEGER2 - 如果INTEGER1等于或大于INTEGER2,则为真。
  • INTEGER1 -le INTEGER2 - 如果INTEGER1等于或小于INTEGER2,则为真。
  • -h FILE - 如果FILE存在,并且是一个符号链接,则为真。
  • -r FILE - 如果FILE存在并且可读,则为真。
  • -w FILE - 如果FILE存在并且可以写入,则为真。
  • -x FILE - 如果FILE存在并且可以执行,则为真。
  • -d FILE - 如果FILE存在,并且是一个目录,则为真。
  • -e FILE - 如果FILE存在并且是一个文件,则为真,无论其类型如何(节点、目录、套接字等)。
  • -f FILE - True 如果FILE存在并且是一个普通的文件(不是一个目录或设备)。

总结

if, if..elseif..elif..else 语句允许你通过评估给定的条件来控制Bash脚本的执行流程。

如果你有任何问题或反馈意见,请随时留言。

最后更新2023-06-28
0 个评论
标签