2017-06-29 47 views
0

我有一個函數,在我試圖比較第一個參數的字符串,然後單獨的布爾變量。shell腳本如果語句compraising的字符串比較和布爾檢查

我的樣品的bool:

EMS=true; 
COLL=true; 

在給定的點,兩個或任何一個,或者都不可以實現的。

我的函數體:

function some_function() { 
... 
... 
    if [ [ "$1" = "ez" ] && $EMS ] || [ "$1" = "coll" ] && $COLL ]; then 
    #do mysterious magic 
    ... 
    ... 
fi 
} 

我打電話,像這樣的功能:

some_function ez 
some_function coll 

然而,當我執行該腳本,我碰到這樣的:

./deployBuild.sh: line 145: [: too many arguments 

我如果廁所p是不正確的,我無法修復它。我如何繼續?什麼我想要實現

僞代碼:

if ("$1" is "ez" AND $EMS evaluates to true) OR ("$1" is "coll" AND $COL evaluates to true) 
+1

此外,你不能包裹'[' - 我添加了另一個副本(間接)解釋這一點。 – tripleee

回答

1

@ xaiwi給你正確的答案:用[[代替o f [ - 在bash手冊中檢查Conditional Constructs

你的邏輯是錯的:

if [[ ("$1" = "ez" && $EMS) || ("$1" = "coll" && $COLL) ]]; 

隨着價值$EMS[[...]],你會得到一個「真」的結果,如果該值是非空 - 見-nConditional Expressions在由於「true」是一個bash命令,因此您可能需要其中的一個

if ([[ $1 = "ez" ]] && $EMS) || ([[ $1 = "coll" ]] && $COLL); then ... 
if { [[ $1 = "ez" ]] && $EMS; } || { [[ $1 = "coll" ]] && $COLL; }; then ... 

第一個使用子殼體進行命令分組;第二個使用當前shell分組語法 - reference

1

近猛砸,你可以嘗試:

if [[ ("$1" = "ez" && $EMS) || ( "$1" = "coll" && $COLL) ]] 

更便攜的解決方案是:

if [ \("$1" = "ez" -a $EMS \) -o \( "$1" = "coll" -a $COLL \) ]