Bashでケースと配列を一緒に使用する

Bashでケースと配列を一緒に使用する

変数が配列に含まれていることを確認することは可能ですかcase?次のようなことをしたい

ARR=( opt1 opt2 opt3 );

case $1 in
    $ARR)
        echo "Option is contained in the array";
    *)
        echo "Option is not contained in the array";
esac

ベストアンサー1

そしてksh93ありがとうこのエラー、あなたはできます:

IFS='|'
ARR=( opt1 opt2 opt3 )

IFS='|'
case $1 in
  (@("${ARR[*]}"))
    echo "Option is contained in the array";;
  (*)
    echo "Option is not contained in the array";;
esac

(今後はバグが修正される可能性があるため、これには依存しません。)

これにより、zsh次のことができます。

case ${ARR[(Ie)$1]}
  (0)
    echo "Option is not contained in the array";;
  (*)
    echo "Option is contained in the array";;
esac

if (( $ARR[(Ie)$1] )); then echo is present...しかし、ここではケース構成の代わりに使用する方が良いかもしれません)。

${array[(I)pattern]}パターンに一致する配列の最後の要素インデックスを返し、そうでない場合は0を返します。このeフラグは精密一致(関連模様マッチ)。

bash、、、、kshyash場合などの特定の文字をzsh想定する準備ができていて、$ARRその文字がnullでない場合は、次のことができます。$1@$ARR

IFS=@
case "@${ARR[*]}@" in
  (*"@$1@"*)
    echo "Option is contained in the array";;
  (*)
    echo "Option is not contained in the array";;
esac

を使用すると、bash -O extglob配列zsh -o kshglob -o globsubst要素に基づいてパターンを作成するヘルパーを定義できます。

arraypat() {
  awk '
    BEGIN{
      if (ARGC <= 1) print "!(*)"
      else {
        for (i = 1; i < ARGC; i++) {
          gsub(/[][|<>\\?*()]/, "[&]", ARGV[i])
          s = s sep ARGV[i]
          sep = "|"
        }
        print "@(" s ")"
      }
    }' "$@"
}

case $1 in
  ($(arraypat "${ARR[@]}"))
    echo "Option is contained in the array";;
  (*)
    echo "Option is not contained in the array";;
esac

おすすめ記事