Shell:在if中使用带参数的函数

And*_*tri 8 shell bash function arguments

我正在尝试执行下面的代码,但是当我尝试在 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
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 14

使用时,if [ ... ]您实际上是在使用该[实用程序(这与test但要求最后一个参数是 相同])。

[不明白运行你的函数,它需要字符串。幸运的是,这里根本不需要使用[(至少对于函数而言):

if [ "$docheck" -eq 1 ] && notContainsElement "$fruit" "${blacklist[@]}"; then
  ...
fi
Run Code Online (Sandbox Code Playgroud)

请注意,我还首先检查了整数,这样如果$docheck不是 1 ,我们就可以完全避免调用该函数。

这是有效的,因为if采用任意命令并根据该命令的退出状态决定要做什么。在这里,我们将[ ... ]测试与对您的函数的调用结合使用,并&&在两者之间创建一个复合命令。如果[ ... ]测试和函数的退出状态都返回零,表示成功,则复合命令的退出状态将为真。

作为一个样式注意,我不会有功能测试数组是否确实包含该元素,但无论如果包含元素,然后

if [ "$docheck" -eq 1 ] && ! contains "$fruit" "${blacklist[@]}"; then ...
Run Code Online (Sandbox Code Playgroud)

在您确实想要测试数组是否包含元素 ( if ! notContainsElement ...) 的情况下,让函数测试结果为负值会弄乱逻辑。