Com ksh93
, graças a este bug , você pode fazer:
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
(Eu não confiaria nele como o bug pode ser consertado no futuro).
Com zsh
, você poderia fazer:
case ${ARR[(Ie)$1]}
(0)
echo "Option is not contained in the array";;
(*)
echo "Option is contained in the array";;
esac
(no entanto, você provavelmente preferiria usar if ((ARR[(Ie)$1])); then echo is present...
aqui em vez de uma construção de caso).
${array[(I)pattern]}
retorna o índice do último elemento que corresponde ao padrão na matriz ou 0 do contrário. O e
flag é para correspondência exata (em oposição à correspondência padrão ).
Com bash
, ksh
, yash
, zsh
, se você estiver pronto para assumir que $ARR
e $1
não contêm um determinado caractere como @
e $ARR
não estará vazio, você pode fazer:
IFS=@
case "@${ARR[*]}@" in
(*"@$1@"*)
echo "Option is contained in the array";;
(*)
echo "Option is not contained in the array";;
esac
Com bash -O extglob
, zsh -o kshglob -o globsubst
, você poderia definir um ajudante que cria um padrão com base nos elementos da matriz:
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