【问题标题】:Bash Multiple conditions in while loop在while循环中打击多个条件
【发布时间】:2020-05-26 02:42:26
【问题描述】:

我正在尝试在 bash 中使用四个条件的简单 while 循环,但是在尝试了各种论坛的许多不同语法后,我找不到解决方案。 当我写“Prod”或“Dev”或“Admin”时,我会留在循环中。

while [ -z $vmProfil ] || [ $vmProfil != 'Prod' ] || [ $vmProfil != "Dev" ] || [ $vmProfil != "Admin" ]
do 
    read -p 'Choose vm profil between Prod, Dev or Admin :' vmProfil
done

【问题讨论】:

    标签: bash loops while-loop boolean-logic multiple-conditions


    【解决方案1】:

    您在应该使用&& 的地方使用||;无论vmProfil 有什么值,至少有一个!= 条件必须为真。

    while [ -z "$vmProfil" ] || <b>{</b> [ "$vmProfil" != 'Prod' ] <b>&amp;&amp;</b> [ "$vmProfil" != "Dev" ] <b>&amp;&amp;</b> [ "$vmProfil" != "Admin" ]<b>; }</b>

    你还可以检查是否有任何条件为真的结果。

    while [ -z "$vmProfil" ] || <b>! {</b> [ "$vmProfil" <b>=</b> 'Prod' ] || [ "$vmProfil" <b>=</b> "Dev" ] || [ "$vmProfil" <b>=</b> "Admin" ]; <b>}</b>

    不过,我会把它写成一个带有显式中断的无限循环。

    while :; do
      read -p '...' vmProfil
      case $vmProfil in
        Prod|Dev|Admin) break ;;
      esac
    done
    

    【讨论】:

    • 我认为你从这个问题中得到了倒退的逻辑:“当我写 'Prod' 或 'Dev' 或 'Admin' 时,我会留在循环中。”
    • 这就是 OP 的代码现在所做的,这与提示暗示他们想要的相反。
    • 你是对的。 OP在问题中的逻辑是倒退的。他试图在他的代码中执行的逻辑是正确的。 +1
    • 另外,未加引号的变量可能是一个问题,尤其是在[ -z $vmProfil ] 中——它可能会起作用,但大多是偶然的。双引号变量引用以避免奇怪的解析问题。
    • 感谢引用 "$vmProfil" 第一次检查 -z "$vmProfil" 是多余的。我确实喜欢案例解决方案,+1
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 2015-12-16
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2022-10-14
    • 2016-02-14
    • 1970-01-01
    相关资源
    最近更新 更多