変数が配列に含まれていることを確認することは可能ですか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
、、、、ksh
のyash
場合などの特定の文字を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