Usando uma variável como uma condição de caso no zsh

5

A minha pergunta é o equivalente zsh da pergunta feita aqui: Como posso usar uma variável como uma condição de caso? Eu gostaria de usar uma variável para a condição de uma instrução case no zsh. Por exemplo:

input="foo"
pattern="(foo|bar)"

case $input in
$pattern)
    echo "you sent foo or bar"
;;
*)
    echo "foo or bar was not sent"
;;
esac

Eu gostaria de usar as strings foo ou bar e ter o código acima executando a condição pattern case.

    
por Smashgen 28.05.2018 / 02:24

1 resposta

6

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
    
por 28.05.2018 / 04:41