30. if 命令


如下所示,if语句可用于评估任何 bash 语句的输出。 在以下语法中,执行语句 1,如果输出为 true,则 bash 将执行语句 2 和 3。一般语法:

if statement1
then
    statement2
    statement3
    ..
fi

在大多数情况下,语句 1 将是括号中的条件表达式,也称为[命令; 这称为简单的then语句。 如果条件表达式为真(非零),bash 执行关键字thenfi之间的语句,否则跳过语句列表。 使用[命令的简单语法:

if [ conditional expression ]
then
    statement1
    statement2
    ..
fi

关键字then应该位于单独的行中。 您可以通过添加分号(;)在与then同一行中使用关键字then,如下所示:

if [ conditional expression ]; then
    statement1
    statement2
    ..
fi

可以使用关键字test代替括号([),使用test命令的语法:

if test conditional expression
then
    statement1
    statement2
    ..
fi

以下示例显示了简单 if 语句的三种变体。

$ cat if-simple.sh
total=${1}

if [ $total -eq 100 ]
then
    echo "total is equal to 100"
fi

if test $total -eq 100
then
    echo "total is equal to 100"
fi

if [ $total -eq 100 ]; then
    echo "total is equal to 100"
fi

执行结果如下:

$ ./if-simple.sh 100
total is equal to 100
total is equal to 100
total is equal to 100

如果您需要在条件表达式为 false 时执行语句,则可以包含else分支。 if – else 语法:

if [ conditional expression ]
then
    statement1
    statement2
    ..
else
    statement3
    statement4
    ..
fi

如果条件表达式为真,bash 执行语句 1 和 2. 如果条件表达式为假,则执行语句 3 和 4。 无论哪种情况,都会继续执行后续语句。 此示例显示 if-then-else-fi语句的用法:

$ cat if-else.sh
total=${1}

if [ $total -eq 100 ]
then
    echo "total is equal to 100"
else
    echo "total is not equal to 100"
fi

if test $total -eq 100
then
    echo "total is equal to 100"
else
    echo "total is not equal to 100"
fi

if [ $total -eq 100 ]; then
    echo "total is equal to 100"
else
    echo "total is not equal to 100"
fi

上面的脚本执行结果如下:

$ ./if-else.sh 101
total is not equal to 100
total is not equal to 100
total is not equal to 100

elifelse if 的缩写。 此结构允许您通过测试两个或多个条件表达式来选择要执行的多个代码块之一。

if-elif-else语法:

if [ conditional expression1 ]
then
    statement1
    statement2
    ..
elif [ conditional expression2 ]
then
    statement3
    statement4
    ..
else
    statement5
fi

  • 如果条件表达式1 为真,则 bash 执行语句1 和 2。否则,如果条件表达式2 为真,则执行语句3 和4。否则,执行语句5。
  • 您可以根据需要使用任意多个elif块,但请记住,表达式将按照从上到下的顺序进行测试,因此到达最后的else块将需要更长的时间。 在时间紧迫的应用中,这可能很重要。

以下示例显示了if-elif-else-fi语句的用法

$ cat if-elif.sh
total=${1}

if [ $total -eq 100 ]
then
    echo "total is equal to 100"
elif [ $total -lt 100 ]
then
    echo "total is less than 100"
else
    echo "total is greater than 100"
fi

$ ./if-elif.sh 101
total is greater than 100

bash 中可以嵌套if语句和else语句。 这本质上与使用elif相同。 但有一个重要的区别:每个if语句必须以相应的fi结尾。 句法如下:

if [ conditional expression1 ]
then
    statement1
    statement2
    ..
else
    if [ conditional expression2 ]
        then
        statement3
        ..
    fi
fi

以下示例显示了if-else-fi语句的用法:

$ cat if-else-if.sh
total=${1}

if [ $total -eq 100 ]
then
    echo "total is equal to 100"
else
    if [ $total -lt 100 ]
    then
        echo "total is less than 100"
    else
        echo "total is greater than 100"
    fi
fi

$ ./if-else-if.sh 101
total is greater than 100

if语句的条件部分中计算算术表达式时,必须非常小心。

对于 shell,您已经知道以下退出状态:

  • 0 表示最后一条命令成功执行(即 true)。
  • 1 表示最后一个命令执行失败(即 false)。

然而,在if语句中,当算术表达式的结果为 0 时,它被认为是 false,而当算术表达式的结果是除 0 之外的任何值时,它被认为是 true。 下面的示例对此进行了解释:

$ cat if-arithmetic-expression.sh
if ((total=total+0)); then
    echo "Expression total=total+0 returned true."
else
    echo "Expression total=total+0 returned false."
fi

if ((total=total+1)); then
    echo "Expression total=total+1 returned true."
else
    echo "Expression total=total+1 returned false."
fi

$ ./if-arithmetic-expression.sh
Expression total=total+0 returned false.
Expression total=total+1 returned true.