bash - 如果返回代码> = 1重新运行脚本,请从头开始

时间:2011-10-31 15:41:11

标签: bash shell goto

我有一个打印标题的bash脚本,并测试值“Y”或“N”。

当有人输入不等于“Y”或“N”的文本时,我想将它们发送回脚本的开头,因此它会再次打印标题和问题。

我知道你可以用goto做到这一点,但我想知道是否有不同的方式,因为我听到很多人说你不应该使用goto或者它已被弃用。无论是否真实,我想看看是否有其他人有办法解决这个问题。

提前致谢。

5 个答案:

答案 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