Eu estou tentando usar uma variável que consiste em diferentes seqüências de caracteres separadas com um |como um caseteste 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 fooou barexecutar a primeira parte da casedeclaração. No entanto, ambos fooe barme levar para o segundo:
$ foo.sh
foo
Bad choice!
$ foo.sh
bar
Bad choice!
Usar em "$string"vez de $stringnã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 casecondição no bash. É possível e, se sim, como?
readme parou. na minha opinião, a validação de entrada do usuário, que é isso que parece ser, os casepadrõ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.
evalopção $ escapando, $ parens, asensisk, asterisk, ponto-e-vírgula e novas linhas. Feio, mas "funciona".