我想在bash脚本中执行类似下面的操作。我如何用bash语法实现。
if !((a==b) && (a==c))
then
do something
end if
答案 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,因为相等运算符== !=
具有比复合比较运算符&& ||
更高的优先级,但我认为将它们保留在那里是明智的如果没别的话就表明意图。