在bash shell脚本中使用复合条件

时间:2011-01-27 02:52:06

标签: bash shell comparison

我想在bash脚本中执行类似下面的操作。我如何用bash语法实现。

if !((a==b) && (a==c))
then 
do something
end if

3 个答案:

答案 0 :(得分:27)

对于数字比较,您可以这样做:

if ! (( (a == b) && (a == c) ))

用于字符串比较:

if ! [[ "$a" == "$b" && "$a" == "$c" ]]

在Bash中,双括号设置了算术上下文(顺便说一下,美元符号主要是可选的)用于比较(也用于for ((i=0; i<=10; i++))$(())算术扩展)并且是用于区分序列与创建子壳的一组单括号。

例如,这会执行命令true,因为它始终是真的,它会执行操作:

if (true); then echo hi; fi 

这与

相同
if true; then echo hi; fi

除了创建子shell之外。但是,if ((true))测试名为“true”的变量的值。

如果要包含美元符号,那么“$ true”将明确地成为变量,但带有单个括号(或没有括号)的if行为会发生变化。

if ($true)

if $true

将作为命令执行变量的内容,并根据命令的退出值执行条件操作(如果内容不是有效命令,则给出“未找到命令”消息)。

if (($true)) 

if ((true))完全相同,如上所述。

答案 1 :(得分:4)

if [ "$a" != "$b" -o "$a" != "$c" ]; then
  # ...
else
  # ...
fi

答案 2 :(得分:2)

#!/bin/bash

a=2
b=3
c=4

if ! (( (a == b) && (a == c) )); then  
  # stuff here
fi

您还可以使用我个人认为更清楚的以下内容:

#!/bin/bash

a=2
b=3
c=4

if (( (a != b) || (a != c) )); then  
  # stuff here
fi

从技术上讲,你不需要围绕子表达式的parens,因为相等运算符== !=具有比复合比较运算符&& ||更高的优先级,但我认为将它们保留在那里是明智的如果没别的话就表明意图。