シェル スクリプト内のネストされた if 文

シェル スクリプト内のネストされた if 文

私の問題がすでに他の投稿で尋ねられていたら申し訳ありませんが、見つけることができませんでした。ネストされた if ステートメントを記述する必要がある小さなシェル スクリプトを作成しています。正しく実行できているかよくわかりません。エラーは発生しませんが、プログラムは期待どおりに機能しません。必要なのは次のようになります。ファイルがすでに にある場合、ユーザーは または と入力して別のデータ セットを取得するか、 または と入力してプログラムを終了するかをMasterFile.txt選択できます。yYnN問題: スクリプトが終了しないファイルが に存在しない場合はMasterFile.txt、データセットを取得します。コードは次のとおりです。

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt;
then {
   echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?"
   read string3
   if "${string3}" = 'Y' || "${string3}" = 'y'; then {
      screen -S trans -L /dev/ttyACM0
      screen -S trans -X stuff 's'$(echo -ne '\015')
      sleep 8s
      screen -S trans -X quit
   }
   else{return}
   fi
else{
#opening screen & begin analysis
screen -S trans -L /dev/ttyACM0
screen -S trans -X stuff 's'$(echo -ne '\015')
sleep 8s
screen -S trans -X quit
}
fi

答え1

より一般的な構文で簡単に書き直すと次のようになります。

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then 
   echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?"
   read string3
   if [[ "${string3^}" == 'Y' ]]; then
      screen -S trans -L /dev/ttyACM0
      screen -S trans -X stuff 's'$(echo -ne '\015')
      sleep 8s
      screen -S trans -X quit
   else
       exit 0
   fi
else
    #opening screen & begin analysis
    screen -S trans -L /dev/ttyACM0
    screen -S trans -X stuff 's'$(echo -ne '\015')
    sleep 8s
    screen -S trans -X quit
fi

ここでは関数が宣言されていないようですので、returnこの使用例では は無効です。プロンプトの質問に対して肯定的でない回答をすると、スクリプト全体が中止されるものと想定し、 を使用していますexit

この構造により、${variable^}の最初の$variable文字が文字の場合は大文字に強制され、応答チェックが簡素化されます。

関連情報