我在脚本中间有以下代码来确认我们是否要恢复脚本。
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
您可以通过将 switch case 保留在函数内来实现。
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