while ループ内にネストされた case ステートメントにより、BASH スクリプトで無限ループが発生する

while ループ内にネストされた case ステートメントにより、BASH スクリプトで無限ループが発生する

この BASH スクリプトでは、case ステートメントで忍者タートルを選択するために、ユーザーが 1 から 4 までの値を入力するように要求しようとしています。他の値を入力すると、$COUNTER は 0 のままになるため、case ステートメントを再度実行する必要があります。ただし、1 から 4 以外の値を入力すると、無限ループに陥ってしまいます。

1つ目 - while ループ内に case ステートメントをネストするにはどうすればよいですか?

2番目 - このスクリプトでユーザーに1〜4の値の入力を要求するにはどうすればよいでしょうか

#!/bin/bash                                    

echo "What is your favorite Ninja Trutle?"     

echo "1 - Raphael."                            
echo "2 - Leonardo."                           
echo "3 - Michelangelo"                        
echo "4 - Donatello"                           

read TURTLE;                                   
COUNTER=0;                                     

while [ $COUNTER -eq 0 ]                       
do                                             
   $COUNTER=$(( $COUNTER + 1 ))                

   case $TURTLE in                             
      1) echo "Raphael is cool, but rude.";;   
      2) echo "Leonardo leads.";;              
      3) echo "Michelangelo is a party dude.";;
      4) echo "Donatello does machines.";;     
      *) echo "Did you even watch the show?"   
         $COUNTER=0                            
         ;;                                    
   esac                                        
done

ご協力いただきありがとうございます。

答え1

エラーは、 を増分する行にありますCOUNTER$シンボルは、変数の名前を逆参照してその値を取得するときに使用されます。変数に値を割り当てるときには使用されません。これらの行は次のように記述する必要があります。

COUNTER=$(( $COUNTER + 1 ))

そして

COUNTER=0

また、caseコマンドがループ内にあるためwhile、無効な値を入力した場合にユーザーに再度プロンプトを表示したいと想定します。その場合は、ステートメントもループread内に配置する必要がありま すwhile

関連情報