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

15

我想在Bash脚本中实现以下功能。如何用Bash语法实现?

if !((a==b) && (a==c))
then
    # Do something
end if
3个回答

28

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

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

用于字符串比较:

if ! [[ "$a" == "$b" && "$a" == "$c" ]]
在Bash中,双括号设置了一个算术上下文(顺便说一句,这里大部分情况下美元符号是可选的),用于比较(也用于for ((i=0; i<=10; i++))$(()) 算术展开),并且用于区分与创建子shell的一组单括号。例如,以下命令执行true命令,并且由于它总是为真,因此它执行相应的操作。
if (true); then echo hi; fi 

这与之前的代码相同

if true; then echo hi; fi

除了创建一个子shell之外,没有什么不同。但是,if ((true))测试名为"true"的变量的值。

如果你包含一个美元符号,那么"$true"就会无歧义地成为一个变量,但是用单括号(或者没有括号)的if行为将会改变。

if ($true)
或者
if $true

会执行变量的内容作为命令,并根据命令的退出值执行条件操作(如果内容不是有效命令,则显示“command not found”消息)。

if (($true)) 

与上述描述的if ((true))执行相同的操作。


谢谢Dennis。这正是我在寻找的语法类型。 - Sanjan Grero
+1 是对双括号的解释!为了清理,我删除了我的其他评论。 - eckes

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

1
或者,进行直接翻译:if [ ! \\( \\( "$a" = "$b" \\) -a \\( "$a" = "$c" \\) \\) ]... - Jonathan Leffler
将运算符反转的逻辑是德摩根定律 - chrisaycock

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

从技术上讲,在子表达式周围不需要括号,因为等式运算符== !=的优先级高于复合比较运算符&& ||,但我认为最好保留它们以显示意图。


感谢SiegeX在这里的精彩解释! - Sanjan Grero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接