Com este código salvo no arquivo first
,
pattern=fo*
input=foo
case $input in
$pattern)
print T
;;
fo*)
print NIL
;;
esac
em -x
, podemos observar que a variável aparece como um valor entre aspas, enquanto a expressão bruta não:
% zsh -x first
+first:1> pattern='fo*'
+first:2> input=foo
+first:3> case foo (fo\*)
+first:3> case foo (fo*)
+first:8> print NIL
NIL
Ou seja, a variável está sendo tratada como uma string literal. Se alguém gasta tempo suficiente em zshexpn(1)
, pode estar ciente do sinalizador de substituição glob
${~spec}
Turn on the GLOB_SUBST option for the evaluation of spec; if the
'~' is doubled, turn it off. When this option is set, the
string resulting from the expansion will be interpreted as a
pattern anywhere that is possible,
se modificarmos $pattern
para usar isso
pattern=fo*
input=foo
case $input in
$~pattern) # !
print T
;;
fo*)
print NIL
;;
esac
vemos em vez
% zsh -x second
+second:1> pattern='fo*'
+second:2> input=foo
+second:3> case foo (fo*)
+second:5> print T
T
para o seu caso, o padrão deve ser citado:
pattern='(foo|bar)'
input=foo
case $input in
$~pattern)
print T
;;
*)
print NIL
;;
esac