Gostaria de ter algo como o seguinte:
#!/bin/sh
# ... other stuff ...
# some relatively static possibilities (srsp):
srsp='this|or|that|the|other'
# more other stuff
case $something in
$srsp) # <- problem is here
do_something # or maybe nothing
;;
this|or|that|the|other);; # this would work, but loses the benefit of a variable
*)
# anything not in my list is an error:
echo "Sorry, I don't recognize $something as one of $srsp" >&2
exit 1;;
esac
do_something | egrep "blah($srsp)thing" # or whatever
O problema é que ter $srsp
corresponde apenas a string inteira (se $something
fosse exatamente a string "this|or|that|or|some|other|stuff"
, corresponderia e chamaria do_something
), em vez de this
ou or
ou that
... e assim por diante: os valores que realmente quero corresponder.
Se eu colocar essa string literal na instrução case (minha linha "isso funcionaria"), ela corresponderá ao que eu quero que corresponda, mas estou tentando manter isso DRY , e eu preciso do mesmo conjunto de strings na expressão regular que uso depois. (Nota: Eu entendo que o que é possível em uma correspondência case
e o que é possível em uma expressão regular pode diferir dramaticamente, mas na minha situação particular eles são compatíveis com ambos. É realmente apenas letras nos componentes individuais, não curingas, apenas o |
, que existe como um caso especial em ambos os sistemas.)
Então, existe uma maneira de fazer isso? Especialmente sem envolver toda a declaração de caso dentro de um eval ou algo assim? Eu gostaria de mantê-lo em uma declaração de caso, porque eu tenho outras coisas acontecendo. (Tenho certeza de que poderia implementar uma solução alternativa reestruturando e usando o egrep como meu teste de correspondência ( if echo $something | egrep "^($srsp)$" > /dev/null
, ou algo assim). Essa pergunta é sobre como tentar encontrar uma maneira de fazer isso sem ter que recorrer a isso. Ou definitivamente saber que isso não pode ser feito também seria uma resposta válida.)
(Ou devo mudar para o common-lisp ?;))
Para minhas necessidades, eu ficaria feliz com sh
ou bash
, com certeza, e possivelmente zsh
, embora se houver uma maneira de fazer isso de uma forma portável máxima (ou seja, sh
), que seria uma resposta melhor, IMHO.