2017-10-06 26 views
0

看來,bash的測試不支持邏輯測試使用多個參數:如何用同一級別的許多「和」或「或」編寫測試?

[ expr1 -o expr2 -o expr3 -o expr4 ] 

也不

[[ expr1 || expr3 || expr3 || expr4 ]] 

同爲 '-a' 和 '& &'。 如何在沒有太多嵌套大括號的情況下以整潔的方式編寫這樣的連接 (特別是當條件更多時)?

+1

你能舉一些不起作用的例子嗎?你在使用哪種Bash?這個對我有用。 – kenorb

+1

這兩個都應該可以正常工作; 'bash'唯一不支持的是'[[...]]內的'-o'或'-a'' – chepner

+1

注意'-o'被認爲是過時的;使用'[expr1] || [expr2]'而不是,但更喜歡'[[expr1 || expr2]]'在哪裏支持。 – chepner

回答

3

看來,bash的測試不支持邏輯測試與多個 參數

它的作用:

$ [ 0 -le 1 -a 1 -le 2 ] && echo yes 
yes 
$ [[ 0 -le 1 && 1 -le 2 ]] && echo yes 
yes 
$ [ 0 -ge 1 -o 1 -ge 2 ] || echo no 
no 
$ [[ 0 -ge 1 || 1 -ge 2 ]] || echo no 
no 

test手冊頁筆記:

注:二進制-a和-o本質上是不明確的。使用'test EXPR1 & & test EXPR2'or'test EXPR1 ||測試EXPR2'。

如果你的問題是,更多的運營商的優先級,請注意&&||慶典列表運算符具有相同的優先級和左結合。因此,有時需要對子表達式進行分組:

{ [[ expr1 ]] && [[ expr2 ]]; } || { [[ expr3 ]] || [[ expr4 ]]; } 

但它很簡單易懂。

0

以下示例適用於Bash 4中的我,例如

$ [ 1 = 1 -a 2 = 2 -a 3 = 3 -a 4 = 4 ] && echo True || echo False 
True 
$ [ 1 = 1 -a 2 = 2 -a 3 = 3 -a 4 = 0 ] && echo True || echo False 
False 
$ [ 1 = 1 -o 2 = 2 -o 3 = 3 -o 4 = 4 ] && echo True || echo False 
True 
$ [ 1 = 1 -o 2 = 0 -o 3 = 0 -o 4 = 0 ] && echo True || echo False 
True 
$ [ 1 = 0 -o 2 = 0 -o 3 = 0 -o 4 = 0 ] && echo True || echo False 
False 

作爲每man [(或man test):

雙方在-a-o總是評價。

要避免這種情況,請寫下:[ -z abc ] && [ -w file ]

+0

該語法*工作*,但也在[POSIX'測試標準](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html)中標記爲過時,並且不鼓勵用於新開發。 –

+1

爲了擴大這個範圍:當使用'-a'和'-o'時,'('和')'也需要支持分組,這導致角落案例試圖消除'('作爲一個字符串例如,'['('=')']'被視爲'('和')'之間的比較,或者它應該被視爲'[-n = ]',分組?這種含糊不清導致互不相容的炮彈;在'test'外面做邏輯運算* *可以避免它。 –

相關問題