Existe uma variável especial contendo uma correspondência de declaração de caso

2

Se você escrever uma instrução Bash case , você pode obter a correspondência atual sem atribuí-la explicitamente a uma variável?

Considere

case $(some subshell command sequence) in
  one) stuff ;;
  *) stuff "$case_match";;
esac

Eu sei que posso fazer o seguinte, mas queria ser mais sucinto.

case_match=$(some subshell command sequence)
case "$case_match" in
...

Existe uma variável especial que representa $case_match ?

Seguindo o comentário de @Hauke Laging , outro exemplo inventado. Você pode fazer isso:

today=$(date '+%A')
case "$today" in
  *) echo "It's $today" ;;
esac

Mas seria bom fazer isso - a pergunta perguntava se isso era possível (mas não é):

case $(date '+%A') in
  *) echo "It's $case_match" ;;
esac

(onde case_match é a variável de ouro que nos ilude)

    
por starfry 11.11.2014 / 12:25

2 respostas

1

Você pode usar um pouco de hack, mas precisa ter certeza de ter uma variável não definida disponível. Por exemplo:

unset foo  # Make sure foo is unset, or at least set to the empty string
case ${foo:-$(date +%m)} in
   1) echo "Jan" ;;
   2) echo "Feb" ;;
 # ...
  11) echo "Nov" ;;
  12) echo "Dec" ;;
esac

Aqui, foo está sendo usado como uma variável fictícia apenas para permitir que a expansão de parâmetro padrão produza a saída da sub-requisição de comando.

    
por 11.11.2014 / 20:51
5

Não.

Com zsh -o extendedglob , no entanto, você pode fazer:

case $(cmd) in
  ((#m)*) printf '%s\n' "Match: $MATCH"
esac

(#m) é a bandeira de globbing ative $MATCH . É mais útil em coisas como ${var//(#m)?/<$MATCH>} .

Ou:

case $(cmd) in
  ((#b)(???)(*)) printf '%s\n' "First 3 chars: $match[1], rest: $match[2]"
esac

(#b) para ativar referências anteriores .

Ou (sem precisar de extendedglob ):

case ${output::=$(cmd)} in
  (*) printf '%s\n' "Output: $output"
esac
    
por 11.11.2014 / 13:01

Tags