我有一个打印标题的bash脚本,并测试值“Y”或“N”。
当有人输入不等于“Y”或“N”的文本时,我想将它们发送回脚本的开头,因此它会再次打印标题和问题。
我知道你可以用goto做到这一点,但我想知道是否有不同的方式,因为我听到很多人说你不应该使用goto或者它已被弃用。无论是否真实,我想看看是否有其他人有办法解决这个问题。
提前致谢。
答案 0 :(得分:4)
您可以在循环中实现它:
while [ !$exit_loop ]
do
echo "enter choice - "
read -n 1 input
case "$input" in
y|Y) $exit_loop = 1;;
n|N) $exit_loop = 1;;
*) echo "invalid choice";;
esac
done
我个人认为使用goto / loop或任何其他方法没有区别。我总是说要使用最合适的情况 - 对你来说,我会使用goto。
e.g。如果你有多个缩进跨越很多行,并且你需要跳回到函数的开头,我会使用goto - 它在上下文中更容易理解。
答案 1 :(得分:2)
如果您想要更结构化的方法,可以使用while or until loop。
答案 2 :(得分:2)
作为对您问题的直接回答,您可以使用exec
将当前流程替换为其他流程,或者视情况而定,替换当前流程的另一个新副本。
read -p "Yes? Or no? " yn
case $yn in
[YyNn]) ;;
*) exec "$0" "$@"
esac
答案 3 :(得分:1)
Example(稍微简化)使用@ Michael的建议如下。退出条件在while循环中,但用户也可以执行中间操作来决定要采取的操作:
while [[ ! "${action-}" =~ ^[SsRr]$ ]]
do
echo "What do you want to do?"
read -n 1 -p $'[d]iff, [s]kip, [S]kip all, [r]eplace, [R]eplace all: \n' action
if [[ "${action-}" =~ ^[Dd]$ ]]
then
diff "$target_path" "$source_path"
fi
done
答案 4 :(得分:-2)
echo "Hello User, are you ready to learn some Linux?"
while true; do
echo "Please enter y/n:"
read a
bfunc() {
if [ "$a" == "y" ]
then
echo "That is great, lets get started!"
echo "This Script is under construction, functionality coming soon"
exit 0
elif [ "$a" == "n" ]
then
echo "That is too bad, see you next time!"
echo "You are now exiting the script"
exit 0
else [ "$a" != "y||n" ]
echo "Please only enter y or n!"
fi
}
bfunc
done