30. if 命令
if-then-fi
如下所示,if
语句可用于评估任何 bash 语句的输出。
在以下语法中,执行语句 1,如果输出为 true,则 bash 将执行语句 2 和 3。一般语法:
if statement1
then
statement2
statement3
..
fi
在大多数情况下,语句 1 将是括号中的条件表达式,也称为[
命令; 这称为简单的then
语句。
如果条件表达式为真(非零),bash 执行关键字then
和fi
之间的语句,否则跳过语句列表。
使用[
命令的简单语法:
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
if-then-else-fi
如果您需要在条件表达式为 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
if-then-elif-then-else-fi
elif
是 else 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
嵌套 if
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
语句中的算术表达式
在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.