
私の問題がすでに他の投稿で尋ねられていたら申し訳ありませんが、見つけることができませんでした。ネストされた 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
答え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
文字が文字の場合は大文字に強制され、応答チェックが簡素化されます。