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}"

答え2

配列があり、$my_array配列に文字列が含まれているかどうかを知りたい場合は、foo可能なテストの1つは次のとおりです。

[[ ${my_array[(ie)foo]} -le ${#my_array} ]]

配列要素の完全な正確な値はでなければなりませんfoo。これは部分文字列のチェックやそれと似ていません。

$my_string変数の値が配列にあるかどうかを確認するには、次のようにします。

[[ ${my_array[(ie)$my_string]} -le ${#my_array} ]]

構文(ie)はあまり明確ではありません。その説明は下付き文字表示部ZSHマニュアル。このi部分は、「逆添字」を使用していることを意味します。通常のように、添え字を渡して値を取得するのではなく、値を渡し、${my_array[1]}その値を提供する最初の添え字を要求します。下付き文字は数字で、1から始まります(配列の最初の要素はインデックス1にあります)。これは、ほとんどのプログラミング言語で使用される規則とは異なります。 inは、拡張パターンマッチング文字なしで正確なマッチングが必要なことを意味しますe(ie)*

配列に値が見つからない場合、${my_array[(ie)foo]最初のインデックスが計算されます。決勝船を通過しました配列のインデックスです。したがって、要素が3つの配列の場合は4を返します。${#my_array}配列の最後の要素のインデックスを提供するため、前者が後者以下である場合、与えられた値は配列のどこかに存在します。与えられた値が次のようなものであることを確認したい場合いいえ次に、配列の「より小さいか等しい」を「より大きい」に変更します。

[[ ${my_array[(ie)foo]} -gt ${#my_array} ]]

関連情報