看來,bash的測試不支持邏輯測試使用多個參數:如何用同一級別的許多「和」或「或」編寫測試?
[ expr1 -o expr2 -o expr3 -o expr4 ]
也不
[[ expr1 || expr3 || expr3 || expr4 ]]
同爲 '-a' 和 '& &'。 如何在沒有太多嵌套大括號的情況下以整潔的方式編寫這樣的連接 (特別是當條件更多時)?
看來,bash的測試不支持邏輯測試使用多個參數:如何用同一級別的許多「和」或「或」編寫測試?
[ expr1 -o expr2 -o expr3 -o expr4 ]
也不
[[ expr1 || expr3 || expr3 || expr4 ]]
同爲 '-a' 和 '& &'。 如何在沒有太多嵌套大括號的情況下以整潔的方式編寫這樣的連接 (特別是當條件更多時)?
看來,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 ]]; }
但它很簡單易懂。
以下示例適用於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 ]
。
該語法*工作*,但也在[POSIX'測試標準](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html)中標記爲過時,並且不鼓勵用於新開發。 –
爲了擴大這個範圍:當使用'-a'和'-o'時,'('和')'也需要支持分組,這導致角落案例試圖消除'('作爲一個字符串例如,'['('=')']'被視爲'('和')'之間的比較,或者它應該被視爲'[-n = ]',分組?這種含糊不清導致互不相容的炮彈;在'test'外面做邏輯運算* *可以避免它。 –
你能舉一些不起作用的例子嗎?你在使用哪種Bash?這個對我有用。 – kenorb
這兩個都應該可以正常工作; 'bash'唯一不支持的是'[[...]]內的'-o'或'-a'' – chepner
注意'-o'被認爲是過時的;使用'[expr1] || [expr2]'而不是,但更喜歡'[[expr1 || expr2]]'在哪裏支持。 – chepner