スクリプトの途中に次のコードを入れて、スクリプトを再開するかどうかを確認します。
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
入力オプションが無効な場合にスイッチケースを呼び出す方法はありますか?
入力はループで行います。ユーザーから有効な応答を受け取った場合は、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つあります。
break
を実行してexit 1
を実行します。read
は、入力の終了やその他のエラーが発生したなどの理由で失敗します。この場合、exit 1
が実行されます。exit 1
の代わりに、return 1
を使用して、ユーザーが続行したくない場合に呼び出し側が何をするかを決定できるようにすることができます。呼び出しコードは次のようになります
if ! ask_continue; then
# some cleanup, then exit
fi
読み取りを繰り返すだけではどうですか。
unset i
while [[ ! "$i" =~ ^[yYnN]$ ]]; do read -r -p "Would you like to continue [Y/N] : " i; done
関数内にスイッチケースを保持することで実行できます。
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
入力が無効な場合、有効な入力を取得するまで関数を呼び出します。
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