問題が他の投稿ですでに質問されている場合はお詫びしますが、見つかりませんでした。ネストされたifステートメントを作成する必要がある小さなシェルスクリプト。正しく実行されているかどうかはわかりません。エラーは発生しませんが、プログラムが期待どおりに機能していません。私が欲しいのは:ファイルがすでにMasterFile.txtにある場合、ユーザーはyまたはY、またはnまたはNと言ってプログラムを終了します。 問題:スクリプトが終了しない。ファイルが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 
コメント
回答
簡単な回答より一般的な構文で記述します。
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の最初の文字を大文字にするため、応答チェックが簡単になります。
コメント
- つまり、2つのことです。1つは
yと入力すると終了し、何を入力しても、次のエラー./test/sh: line19: [[variable: command not found - スクリプトの最初の行が
#!/bin/bashであり、。[[ [...] ]]構造はbash主義です。 - はい、ヘッダーは正しいです
 - そして
[[と"${string3^}"の間にスペースがありますか? - それだけです!!もう一度ありがとうございます。時間があれば、
[[の意味と、スペースが非常に重要になる理由を教えていただけませんか? 
shタイプのシェルは'ブロックに{ ... }を使用しません。{...}が問題だとは思いません。ネストされたifの実装方法に問題があるはずです
if "${string3}" = 'Y'は、コマンドの名前としてstring3の内容を取り、2つの引数=と…