2011-01-27 15 views

回答

27

對數值比較,你可以這樣做:

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 ($true) 

if $true 

將執行變量的內容爲命令,並執行基於該命令的退出值條件的動作(或送「未找到命令」消息,如果內容AREN是一個有效的命令)。

if (($true)) 

和上述的if ((true))一樣。

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 

從技術上講不需要周圍的子表達式的括號,因爲平等運營商== !=有較高優先,那麼兩個複合比較運算符&& ||,但我認爲明智的做法是讓他們在那裏顯示意圖,如果沒有別的。

+0

感謝SiegeX在這裏的很好的解釋! – 2011-01-27 03:20:05

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

或者,直接翻譯:`if [! \\(\\(「$ a」=「$ b」\\)-a \\(「$ a」=「$ c」\\)\\)]`... – 2011-01-27 03:09:56

+0

顛倒運算符的邏輯像這是[De Morgan's law](http://en.wikipedia.org/wiki/De_Morgan's_laws)。 – chrisaycock 2011-01-27 03:20:34