【问题标题】:how to 'break' out of an if loop in bash?如何“打破” bash 中的 if 循环?
【发布时间】:2014-01-09 03:12:49
【问题描述】:

当我在 bash 的 if 循环中使用 break 时,它告诉我它对 bash 无效,我可以改用什么?

用例是,用户被问到一个问题,如果他回答“否”,脚本应该跳到下一部分。

if [[ $ans1_1 = "y" ]]; then
    fedoraDeps
elif [[ $ans1_1 = "n" ]]; then
    break
else
    echo "Answer 'y' or 'n' "
fi

【问题讨论】:

  • 是的,在某些情况下,例如当条件使用文件系统时,不检查“if elif ..elif else fi”模式的所有条件会很有用。

标签: bash shell


【解决方案1】:

if 语句不是“循环”,因此打破它们没有意义。如果你想让你的一个块成为空操作,你可以使用内置的: 命令,它什么都不做:

if [[ $ans1_1 = y ]]; then
    fedoraDeps
elif [[ $ans1_1 = n ]]; then
    :
else
    echo "Answer 'y' or 'n'"
fi

【讨论】:

  • 有意义的是避免在某些条件下测试 if then elif elif ... fi 构造的所有条件,例如条件调用文件系统时。
【解决方案2】:

对于这个例子,我认为使用case 更有意义。

case $ans1_1 in
    y)fedoraDeps;;
    n);;
    *) echo "Answer 'y' or 'n'";;
esac

来自man bash

如果;;使用运算符,在第一个模式匹配后不会尝试后续匹配。

【讨论】:

  • 这看起来更干净,更容易维护。我将更新我的脚本以改为用例。谢谢
【解决方案3】:

我同意这种情况可能是最好的。但无论哪种方式,您都应该转换为大写/小写。对于你拥有它的方式:

if [[ ${ans1_1,,} = "y" ]]; then
   fedoraDeps
elif [[ ${ans1_1,,} = "n" ]]; then
   :
else
   echo "Answer 'y' or 'n' "
fi

或者,如果你想要大写 ${ans1_1^​​^}

【讨论】:

    【解决方案4】:

    这听起来像是select 命令的理想案例:

    PS3="Please make a selection   >"
    select foo in 'y' 'n'; do
        case $foo in
            'Y')
                fedoraDeps
                ;;
            'y')
                fedoraDeps
                ;;
            'n')
                break
                ;;
         esac
    done
    

    【讨论】:

    • 但这是否意味着用户不必输入普通的y/n 输入,而是必须输入1 表示是,2 表示否?为此目的,这似乎是不必要的复杂。
    • 公平地说,12 并不比 yn 复杂,但如果目标是不断询问直到做出有效选择,@987654332 @ 是完成这项工作的最佳工具之一。
    • 显示1) y2) n,并且必须输入12 而不是yn,只需输入y 肯定会更复杂/n。我看不出你会有什么感觉。
    • break 仅在 循环 中有意义...ifcase 没有循环。改用:(什么都不做)或case你可以resp。应该简单地删除break-line。
    • 顺便说一句:正如@Coder-guy 在his answer 中已经简要提到的那样,我会使用case "${foo,,}" in 来避免必须维护2 个相同的情况。
    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2020-06-15
    • 2022-10-14
    相关资源
    最近更新 更多