Eu estou tentando usar uma variável que consiste em diferentes seqüências de caracteres separadas com um |
como um case
teste de instrução. Por exemplo:
string="\"foo\"|\"bar\""
read choice
case $choice in
$string)
echo "You chose $choice";;
*)
echo "Bad choice!";;
esac
Quero poder digitar foo
ou bar
executar a primeira parte da case
declaração. No entanto, ambos foo
e bar
me levar para o segundo:
$ foo.sh
foo
Bad choice!
$ foo.sh
bar
Bad choice!
Usar em "$string"
vez de $string
não faz diferença. Nem usa string="foo|bar"
.
Eu sei que posso fazer assim:
case $choice in
"foo"|"bar")
echo "You chose $choice";;
*)
echo "Bad choice!";;
esac
Posso pensar em várias soluções alternativas, mas gostaria de saber se é possível usar uma variável como uma case
condição no bash. É possível e, se sim, como?
read
me parou. na minha opinião, a validação de entrada do usuário, que é isso que parece ser, os case
padrões não devem estar no topo da lista de avaliação e devem ser reduzidos ao *
padrão padrão, de modo que os únicos resultados que chegam lá sejam garantidos aceitáveis. Ainda assim, como o problema é de ordem de análise / expansão, uma segunda avaliação pode ser necessária.
eval
opção $ escapando, $ parens, asensisk, asterisk, ponto-e-vírgula e novas linhas. Feio, mas "funciona".