問題が他の投稿ですでに質問されている場合はお詫びしますが、見つかりませんでした。ネストされた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つの引数=
と…