Bash

Shell:在 if 中使用帶參數的函式

  • July 14, 2018

我正在嘗試執行下面的程式碼,但是當我嘗試在 if 語句中使用我的函式時,我得到了-bash: [: too many arguments錯誤。為什麼會這樣?

先感謝您!

notContainsElement () {
 local e match="$1"
 shift
 for e; do [[ "$e" == "$match" ]] && return 1; done
 return 0
}

list=( "pears" "apples" "bananas" "oranges" )
blacklist=( "oranges" "apples" )
docheck=1

for fruit in "${list[@]}"
do
   if [ notContainsElement "$fruit" "${blacklist[@]}" -a $docheck = 1 ]
   then
       echo $fruit
   fi
done

使用時,if [ ... ]您實際上是在使用該[實用程序(與 相同test但要求最後一個參數是])。

[不明白執行你的函式,它需要字元串。幸運的是,您根本不需要[在這裡使用(至少對於該功能):

if [ "$docheck" -eq 1 ] && notContainsElement "$fruit" "${blacklist[@]}"; then
 ...
fi

請注意,我還要先檢查整數,這樣如果$docheck不是 1,我們就可以完全避免呼叫該函式。

這是有效的,因為if接受任意命令並根據該命令的退出狀態決定要做什麼。在這裡,我們將[ ... ]測試與對您的函式的呼叫一起使用,並&&在兩者之間創建一個複合命令。如果測試和函式都返回零作為其退出狀態,則復合命令的退出狀態將為真[ ... ],表示成功。

作為樣式說明,我不會有函式測試數組是否不包含元素,**但是否包含元素,然後

if [ "$docheck" -eq 1 ] && ! contains "$fruit" "${blacklist[@]}"; then ...

如果您確實想要測試數組是否包含元素 ( if ! notContainsElement ...) ,則讓函式測試否定會弄亂邏輯。

引用自:https://unix.stackexchange.com/questions/455125