caso nested – ¿por qué debe ";;" colocarse después de posibles commands y no directamente detrás de "esac"?

Me gustaría una explicación sobre la terminación ;; en una statement de caso anidada.

Está documentado en alguna parte?

¿Por qué no funciona así?

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

pero funciona así:

 #!/bin/ksh var1="C" var2=0 case ${var1} in A) print "A" ;; B) print "B" ;; C) print "C" case $var2 in 0) print "AB" ;; 1) print "C" ;; esac print "why here?" ;; *) print ${var1} ;; esac 

;; delimita los bloques de casos. Entonces, ¿qué espera encontrar el intérprete de commands después de que sea otro patrón que comience un nuevo bloque de casos, o esac para marcar el final del enunciado de case ? print something no es esac y no es un patrón válido, por lo que se obtiene un error. Si quiere un locking de caso pnetworkingeterminado / fallido, use *) o (*) :

 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 requinetworking before the esac. 

Si las declaraciones de case están anidadas o no tiene nada que ver con eso.

Me parece bien documentado en la página man de Bash:

extracto

  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. 

Esto no funcionará porque el ;; la notación está fuera del caso … bloque esac.

  esac ;; print "why here?" 

También su ejemplo muestra el shell Korn ( ksh ), pero la notación es la misma de lo que sé sobre ksh . Se muestra aquí también:

  • Case (ksh) – Progtwigción y scripting de shell

Referencias

  • La statement del caso – bash-hackers.org