スクリプトを再開することを確認するために、スクリプトの途中に次のコードがあります。
read -r -p "Would you like to continue [Y/N] : " i
case $i in
[yY])
echo -e "Resuming the script";;
[nN])
echo -e "Skipped and exit script"
exit 1;;
*)
echo "Invalid Option"
;;
esac
入力オプションが無効であるかどうかを知る方法があるかどうか疑問に思います。 switch-caseを呼び出す方法はありますか?
答え1
ループ入力。ユーザーから有効な応答を受信すると、ループを終了しますbreak
(またはexit
場合によっては)。
while true; do
read -p 'Continue? yes/no: ' input
case $input in
[yY]*)
echo 'Continuing'
break
;;
[nN]*)
echo 'Ok, exiting'
exit 1
;;
*)
echo 'Invalid input' >&2
esac
done
ユーティリティ機能:
ask_continue () {
while true; do
read -p 'Continue? yes/no: ' input
case $input in
[yY]*)
echo 'Continuing'
break
;;
[nN]*)
echo 'Ok, exiting'
exit 1
;;
*)
echo 'Invalid input' >&2
esac
done
}
EOFを介した終了を可能にするユーティリティ関数の変形(例:を押すCtrl+D):
ask_continue () {
while read -p 'Continue? yes/no: ' input; do
case $input in
[yY]*)
echo 'Continuing'
return
;;
[nN]*)
break
;;
*)
echo 'Invalid input' >&2
esac
done
echo 'Ok, exiting'
exit 1
}
ループから外れる3つの方法があります。
- ユーザーが「yes」と入力すると、関数が返されます。
- ユーザーが「no」と入力すると、
break
ループを終了してを実行しますexit 1
。 read
この場合、入力の終了やその他のエラーが原因で失敗した場合に実行されますexit 1
。
代わりに、ユーザーが続行したくない場合に実行するアクションを発信者が決定することを許可をexit 1
使用できます。return 1
呼び出しコードは次のとおりです。
if ! ask_continue; then
# some cleanup, then exit
fi
答え2
もう一度読んでみてはいかがでしょうか?
unset i
while [[ ! "$i" =~ ^[yYnN]$ ]]; do read -r -p "Would you like to continue [Y/N] : " i; done
答え3
機能内部にスイッチケースを保持するだけです。
function testCase ()
{
read -r -p "Would you like to continue [Y/N] : " i
case $i in
[yY])
echo -e "Resuming the script";;
[nN])
echo -e "Skipped and exit script"
exit 1;;
*)
echo "Invalid Option"
testCase
;;
esac
}
testCase
入力が無効な場合は、有効な入力が得られるまで関数を呼び出します。
答え4
until [ "$i" = "0" ]
do
read -r -p "Would you like to continue [Y/N] : " i
case $i in
[yY])
echo -e "Resuming the script";;
[nN])
echo -e "Skipped and exit script"
exit 1;;
*)
echo "Invalid Option"
;;
esac
done