2017-02-01 71 views
1

這兩條線如何測試命令管道的輸出

function some { 
     ## myFunc(true) is just a pattern 
     local isEnabled="grep myFunc(true) $indexFile | grep true" 
     if [ -z $($isEnabled) ]; then ... fi 
    } 

給我: binary operator expected

,但是當我刪除管道符號|它的工作原理,在執行如何使管道命令?我正在使用sh

+0

是'myFunc(true)'模式還是函數調用? – codeforester

+0

它只是一個模式 –

+1

請參閱[BashFAQ#50](http://mywiki.wooledge.org/BashFAQ/050)瞭解有關在字符串中存儲代碼的注意事項。 –

回答

1

您正在收到該錯誤,因爲$($isEnabled)正在擴展爲空,而[ -z ]需要參數。

  • 需要把myFunc(true)在單或雙引號,因爲()具有特殊的意義
  • 最好附上$indexFile在雙引號,以防止同樣的問題

您可以重寫代碼爲sh

function some { 
    local isEnabled=$(grep 'myFunc(true)' "$indexFile" | grep true) 
    if [ -z "$isEnabled" ]; then 
    : your logic here 
    fi 
} 

或者更直接地作爲:

function some { 
    # just interested in the presence or absence of a pattern 
    # irrespective of the matching line(s) 
    if grep 'myFunc(true)' "$indexFile" | grep -q true; then 
    : your logic here 
    fi 
} 

或者,在猛砸使用[[ ]]

function some { 
    local isEnabled=$(grep 'myFunc(true)' "$indexFile" | grep true) 
    if [[ $isEnabled ]]; then 
    : your logic here 
    fi 
} 
  • [[ $var ]][[ -z $var ]][[ -n $var ]]好。只要$var的長度> 0,它就會評估爲真。

  • 不需要在引號內包含變量[[ ]] - Bash處理擴展時不會出現任何分詞或通配符擴展問題。