Estou procurando um operador “in” que funcione mais ou menos assim:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Obviamente, é uma declaração muito mais curta em comparação com, digamos, o uso de vários testes "ou".
Você pode usar
case
...esac
Ex.
Com
ksh
,bash -O extglob
ouzsh -o kshglob
, você também pode usar um padrão glob estendido:Com
bash
,ksh93
ouzsh
, você também pode usar uma comparação de expressão regular:Não há um teste "in" no bash, mas há um teste regex (não no bourne):
E geralmente escrito usando uma variável (menos problemas com aspas):
Para um shell Bourne mais antigo, você precisa usar uma correspondência de caso:
Usar um
case
é bom e bom se você tiver um conjunto fixo de animais de estimação com os quais deseja competir. Mas não funcionará se você precisar construir o padrão em tempo de execução, poiscase
não interpreta a alternância de dentro dos parâmetros expandidos.Isso corresponderá apenas à string literal
cat|dog|mouse
:Você pode, no entanto, usar uma variável com a correspondência de expressão regular. Contanto que a variável não esteja entre aspas, quaisquer operadores regex dentro dela têm seus significados especiais.
Você também pode usar matrizes associativas. Verificar se existe uma chave em uma é a coisa mais próxima de um
in
operador que o Bash oferece. Embora a sintaxe seja um pouco feia:(
${arr[$1]+x}
expande parax
searr[$1]
for definido, vazio caso contrário. )Você poderia usar uma
case
instrução em umif
teste, mas o código ficaria um pouco complicado:ou um pouco mais curto,
Isso está usando uma
case
cláusula apenas para fazer a correspondência de padrão para aif
cláusula. Ele introduz um teste verdadeiro/falso desnecessário.É melhor usar apenas
case
:Não faça isso:
ou isto:
... porque você está apenas adicionando lixo mais perigoso, apenas para poder usar uma
if
instrução em seu código no lugar de uma instrução perfeitamente razoávelcase
.grep
abordagem.-q
para evitar qualquer saída para a tela (mais rápido de digitar do que>/dev/null
).-E
(cat|dog|mouse)
para aspectos de expressões regulares estendidas precisa disso.^(cat|dog|mouse)$
corresponde a qualquer linha começando (^
) com gato, cachorro ou rato ((cat|dog|mouse)
) seguido pelo final da linha ($
)