zsh配列に与えられた値が含まれているかどうかを確認するには?

zsh配列に与えられた値が含まれているかどうかを確認するには?

次のように定義された非関連配列があるとします。

my_array=(foo bar baz)

配列に与えられた文字列が含まれているかどうかを確認するには?私はブロックの条件if(例えばif contains $my_array "something"; then ...)で利用可能な解決策を好みます。

ベストアンサー1

array=(foo bar baz foo)
pattern=f*
value=foo

if (($array[(I)$pattern])); then
  echo array contains at least one value that matches the pattern
fi

if (($array[(Ie)$value])); then
  echo value is amongst the values of the array
fi

$array[(I)foo]fooin が最後に現れるインデックスを返し$array、見つからない場合は 0 を返します。このフラグは、パターン一致ではなく正確な一致であることをe示します。e

$value属していることを確認するには言葉匿名関数に渡し、関数本文で見つけることができる値のリスト$value$@

if ()(( $@[(Ie)$value] )) foo bar baz and some more; then
  echo "It's one of those"
fi

値が配列に何回表示されるかを確認するには、${A:*B}演算子(A配列にも存在する配列の要素B)を使用できます。

array=(foo bar baz foo)
value=foo
search=("$value")
(){print -r $# occurrence${2+s} of $value in array} "${(@)array:*search}"

または、配列要素にパターンマッチングを使用します。

(){print -r $# occurrence${2+s} of $value in array} "${(M@)array:#$value}"

おすすめ記事