シェル:ifでパラメータで関数を使用する

シェル: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

ベストアンサー1

これはif [ ... ]実際に[ユーティリティを使用することです(test最後の引数と同じですが必要です])。

[関数を実行するには文字列が必要であることを理解していません。幸いなことに[、ここではまったく使用する必要はありません(少なくともこの機能の場合)。

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

また、整数を最初にチェックして、$docheck1以外の場合は関数呼び出しを回避できます。

ifこれは、任意のコマンドを受け入れ、コマンドの終了状態に基づいて実行するアクションを決定するために機能します。ここでは[ ... ]テストと関数呼び出しを使用し、&&途中で複合コマンドを作成します。[ ... ]テストと関数の両方が終了状態に0を返すと、複合コマンドの終了状態はtrueになり、成功を示します。

スタイルを参考に、配列いいえ要素を含むが、次のような場合する要素を含む

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

機能テストの結果が否定的である場合、論理は混乱します。する配列に要素(if ! notContainsElement ...)が含まれているかどうかをテストしたいと思います。

おすすめ記事