Bashスクリプトに「はい/いいえ」構造があるとしましょう。
read -r -p "Yes or no?" response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
do ...
else
exit 0
fi
私は「いいえ」を押すまでこの設定を実行したいと思います。つまり、「はい」を押してから「Do...」を完了したら、「はいまたはいいえ?」で返信したいと思います。
答え1
あなたが望むものではないまで、応答を依頼する必要があります。
while true;
do
read -r -p "Yes or no? " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
then
echo "You chose yes"
else
exit 0
fi
done
答え2
whileループを使用してください:
while
read -r -p "Yes or no? " response &&
[[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
do
...
done
sh
または、インストールする必要がないように、コードをPOSIXと互換性があるようにしてくださいbash
。
while
printf 'Yes or No? ' &&
read answer
do
case $answer in
([yY][eE][sS] | [yY]) ...;;
(*) break;;
esac
done
printf
ループの終了条件として、失敗した終了状態(壊れたパイプを示す可能性があります)と(eofを示す可能性があります)も確認します。read
これは一般的に欲しいものだからです。
bash
sの場合、プロセスに組み込まれたシェルによってプロンプトが表示されるため、 stdoutが破損しread -p
たパイプにread
なるとシェルは終了しますが、シェルが終了するかprintf
どうかは実装printf
によって異なります。sh
実装には組み込み機能がありますprintf
。一貫性のために、printf
エラーを独自のスクリプトエラーとして報告することもできます。
while
printf 'Yes or No? ' || exit # with the exit status of printf
read answer # eof not considered as an error condition
do
case $answer in
([yY][eE][sS] | [yY]) ...;;
(*) break;;
esac
done