入れ子になった場合 - 「;;」を「esac」の直後に配置せずに、可能なコマンドの後に配置する必要があるのはなぜですか。

入れ子になった場合 - 「;;」を「esac」の直後に配置せずに、可能なコマンドの後に配置する必要があるのはなぜですか。

;;ネストされたケースの説明では、終了の説明が必要です。

どこかに文書化されていますか?

なぜ次のように動作しないのですか?

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

しかし、その仕組みは次のとおりです。

#!/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

答え1

;;別のケースブロック。それでは、シェルが他のものを見つけることを期待するものは何ですか?模様新しいケースブロックを開始するか、問い合わせの終わりをesac表示します。ではなく、無効です。caseprint somethingesac模様そのため、エラーが発生します。ひとりが欲しいなら基本/戻るケースブロック、使用*)または(*)

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.

ステートメントがネストcaseされたかどうかは関係ありません。

答え2

Bashのマニュアルページによく文書化されているようです。

抜粋

   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.

;;シンボルがCase ... esacブロックの外にあるため、機能しません。

 esac
 ;; 
 print "why here?"

また、あなたの例にはKornシェル(ksh)が表示されていますが、シンボルは私が理解しているものと同じですksh。ここにも表示されています。

引用する

関連情報