具有多个条件的bash-if语句
在编写Bash脚本时,我们希望根据条件有多个可能的控制流。if条件语句可以隐式将测试表达式转换为布尔值,从而有条件地处理语句。使用if语句和多个条件,我们可以在值和预期之间进行逻辑比较。我们还可以使用多个条件可选地指定else子句。
在本教程中,我们将学习如何使用if语句连接多个条件。
多个条件
有时,使用if语句的测试表达式可能并不那么简单和直接。我们可能需要连接多个表达式来开发代码流的条件。对于这种涉及多个条件的情况,我们可以使用不同的方法。
使用Bash逻辑运算符
逻辑运算符以这样的方式连接两个或多个表达式,使得复合表达式的值仅取决于原始表达式和运算符的值。在Bash中,这些逻辑运算符是AND(&&)和OR(||)。
语法
[ EXPR1 ] && [ EXPR2 ] 如果EXPR1和EXPR2都为真,则为真。
[ EXPR1 ] || [ EXPR2 ] 如果EXPR1或EXPR2中任一一个为真,则为真。
例子
num=150``if` `[ $num -gt 100 ] && [ $num -lt 200 ]; ``then` `echo` `true``; ``else` `echo` `false``; ``fi
Bash将表达式拆分为更简单的表达式,然后单独评估每个表达式。完成后,它再查看逻辑运算符以重新组装这些表达式,以确定原始表达式的结果。在这个例子中,整数值存在于变量num中。if条件可以被视为2个单独的if语句。第一个检查变量是否大于100,这是真的。第二个检查数字是否小于200,这也是真的。由于两者都是真的,我们有一个逻辑AND,结果也变为真。这会触发“then”块中存在的语句。
使用单个测试别名
Bash允许我们使用逻辑运算符将多个条件合并为一个测试别名。我们需要使用-a(表示and)和-o(表示or)操作。评估如下:
语法
[ EXPR1 -a EXPR2 ] 如果EXPR1和EXPR2都为真,则为真。
[ EXPR1 -o EXPR2 ] 如果EXPR1或EXPR2中任一一个为真,则为真。
例子
num=150``if` `[ $num -gt 100 -a $num -lt 200 ]; ``then` `echo` `true``; ``else` `echo` `false``; ``fi``if` `[ $num -gt 100 -o $num -lt 50 ]; ``then` `echo` `true``; ``else` `echo` `false``; ``fi
Bash使用与前一个示例中相同的逻辑,将表达式拆分为更简单的表达式,然后单独评估每个表达式。然后,它检查运算符并重新组装这些表达式以计算原始表达式的结果。可以将此示例视为2个单独的if语句,使用-a标志连接在一起。由于两者都为真,结果为真,因此“then”块执行。
同样,在下一个示例中,表达式的第一部分为真,第二部分为假。使用-o标志将它们组合将导致结果为真,如果任何表达式的结果为真。
使用双方括号
使用if语句具有多个条件的另一种方法是使用双方括号符号。
语法
[[ EXPR1 && EXPR2 ]] 如果EXPR1和EXPR2都为真,则为真。[[ EXPR1 || EXPR2 ]] 如果EXPR1或EXPR2中任一一个为真,则为真。
例子
num=150``if` `[[ $num -gt 100 && $num -lt 200 ]]; ``then` `echo` `true``; ``else` `echo` `false``; ``fi``if` `[[ $num -gt 100 || $num -lt 50 ]]; ``then` `echo` `true``; ``else` `echo` `false``; ``fi
在这个例子中,我们使用双方括号,所以我们可以在条件测试中直接使用逻辑运算符。使用双方括号的好处之一是可以使用更多的比较运算符,例如=,!=,, =。
三元运算符
使用三元运算符来处理多个条件也是一种有效的方法。三元运算符是一个具有三个操作数的运算符,其中第一个操作数是一个比较运算符,第二个操作数是真值时返回的值,第三个操作数是假值时返回的值。
语法
[ EXPR1 ] && echo "true" || echo "false"
例子
num=150``[ $num -gt 100 ] && echo "true" || echo "false"``[ $num -lt 100 ] && echo "true" || echo "false"
在这个例子中,如果第一个测试条件为真,则输出true。否则,输出false。第二个测试条件返回false,因此我们得到了false输出。
使用case语句
使用case语句也是一种有效的方法来处理多个条件。case语句使用模式匹配来测试变量或表达式中的值,并根据匹配到的模式执行相应的命令。
语法
`case` `$variable` `in`
`pattern1` `)` `command1` `;;`
`pattern2` `)` `command2` `;;`
...
`patternN` `)` `commandN` `;;`
`esac`
例子
fruit=apple
case $fruit in
apple) echo "This is an apple.";;
banana) echo "This is a banana.";;
*) echo "This is not an apple or a banana.";;
esac
在这个例子中,我们测试变量$fruit,并使用模式匹配测试其值。如果它匹配模式“apple”,则输出“This is an apple.”。如果它匹配模式“banana”,则输出“This is a banana.”。否则,输出“This is not an apple or a banana.”。
结论
在Bash脚本中,if语句是一种非常有用的工具,可用于控制流的条件处理。处理多个条件的方法有多种,包括逻辑运算符,单个测试别名,双方括号,三元运算符和case语句。您可以根据实际需要选择合适的方式。