caso aninhado - por que deve ser colocado “;;” após possíveis comandos e não diretamente atrás de “esac”?

1

Eu gostaria de uma explicação sobre a terminação ;; em uma declaração de caso aninhada.

Está documentado em algum lugar?

Por que não funciona assim:

     #!/bin/ksh  
     ...    
     esac
     ;; 
     print "why here?"
     ...

mas funciona assim:

#!/bin/ksh

var1="C" 
var2=0

case ${var1} in
  A) print "A"  
  ;;

  B) print "B"
  ;;

  C) print "C"

     case $var2 in
       0)
         print "A B"
         ;;
       1)
         print "C"           
         ;;
     esac
     print "why here?"
     ;;  

  *) print ${var1}
  ;;
esac
    
por Krapouille 05.06.2014 / 15:31

2 respostas

4

;; delimita os blocos do caso. Então, o que o shell espera encontrar depois é outro padrão iniciando um novo bloco de casos ou esac para marcar o final da instrução case . print something não é esac e não é um padrão válido , portanto, você recebe um erro. Se você quiser um bloco de casos padrão / voltar , use *) ou (*) :

case $something in
  (foo) cmd1
        cmd2
        ;; # end of first block
  (bar) cmd3;; # end of second block
  (*)   cmd4 # default case block
esac # note that the ;; is not required before the esac.

Se as declarações case estão aninhadas ou não têm nenhum significado nisso.

    
por 05.06.2014 / 16:53
2

Parece bem documentado para mim na man page do Bash:

trecho

   case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac
        A case command first expands word, and tries to match it against 
        each pattern in turn, using the same matching rules as for 
        pathname expansion  (see Pathname Expansion below).  The word is 
        expanded using tilde expansion, parameter and variable expansion, 
        arithmetic substitution, command substitution, process substitution 
        and quote removal.  Each pattern examined is expanded  using  tilde  
        expansion,  parameter  and  variable  expansion,  arithmetic  
        substitution, command substitution, and process substitution.  If 
        the shell option nocasematch is enabled, the match is performed 
        without regard to the case of alphabetic characters.  When a match  
        is  found, the  corresponding list is executed.  

        If the ;; operator is used, no subsequent matches are attempted 
        after the first pattern match. Using ;& in place of ;; causes 
        execution to continue with the list associated with the next set of 
        patterns.  Using ;;& in place  of ;;  causes  the shell to test the 
        next pattern list in the statement, if any, and execute any 
        associated list on a successful match. The exit status is zero if no 
        pattern matches.  Otherwise, it is the exit status of the last 
        command executed in list.

Isso não funcionará porque a notação ;; está fora do caso ... bloco esac.

 esac
 ;; 
 print "why here?"

Além disso, seu exemplo mostra o shell Korn ( ksh ), mas a notação é a mesma do que eu sei sobre ksh . Também é mostrado aqui:

Referências

por 05.06.2014 / 15:58