Estou procurando um operador "in" que funcione dessa maneira:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
É obviamente uma afirmação muito mais curta em comparação com, digamos, o uso de vários testes "ou".
bash
shell-script
bourne-shell
mrjayviper
fonte
fonte
=~
não é válida no interior do POSIX suporte único teste[
é POSIX, mas[[
é característica prolongado de bash, ksh (aparentemente é originado a partir de lá, e zsh.case
exemplo é mais POSIX de tudo, porémcase "$1" in
não precisa ser citado, nenhuma divisão de palavras nem expansão de nome de caminho são executadas nesse token.Não existe um teste "in" no bash, mas existe um teste regex (não no bourne):
E geralmente escrito usando uma variável (menos problemas com citações):
Para um shell Bourne mais antigo, você precisa usar uma correspondência de caso:
fonte
O uso de um
case
é bom e bem, se você tiver um conjunto fixo de animais de estimação com quem deseja comparar. Mas não funcionará se você precisar criar o padrão em tempo de execução, poiscase
não interpreta a alternância de dentro de parâmetros expandidos.Isso corresponderá apenas à cadeia literal
cat|dog|mouse
:No entanto, você pode usar uma variável com a correspondência de expressão regular. Contanto que a variável não seja citada, quaisquer operadores de expressões regulares 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 Bash fornece. Embora a sintaxe seja um pouco feia:(
${arr[$1]+x}
expande parax
searr[$1]
estiver definido, vazio caso contrário. )fonte
Você poderia usar uma
case
declaração em umif
teste, mas o código ficaria um pouco cabeludo:ou um pouco mais curto,
Isso está usando uma
case
cláusula apenas para fazer a correspondência de padrões para aif
cláusula. Introduz um teste verdadeiro / falso desnecessário.É melhor usar apenas
case
:Não faça isso:
ou isto:
... porque você está apenas adicionando itens mais perigosos, apenas para poder usar uma
if
instrução em seu código no lugar de umacase
instrução perfeitamente razoável .fonte
eval
dacase
declaração nesse caso, e seria ainda mais propenso a erros."$1"|"$2"|"$3"
. Também unix.stackexchange.com/a/234415/85039 Mas sim, é um pouco cabeludo.grep
abordagem.-q
para evitar qualquer saída na tela (digitar mais rápido que>/dev/null
).-E
para expressões regulares estendidas, os(cat|dog|mouse)
aspectos precisam disso.^(cat|dog|mouse)$
corresponde a qualquer linha que comece (^
) com gato, cachorro ou mouse ((cat|dog|mouse)
) seguida do final da linha ($
)fonte