Bash
Shell:在 if 中使用帶參數的函式
我正在嘗試執行下面的程式碼,但是當我嘗試在 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 ...
) ,則讓函式測試否定會弄亂邏輯。