Bash while 循环中的多个条件

Bash Multiple conditions in while loop

提问人:Boris 提问时间:2/11/2020 最后编辑:CyrusBoris 更新时间:2/11/2020 访问量:978

问:

我正在尝试在使用四个条件的 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 循环 while 循环 逻辑 多条件

评论


答:

3赞 chepner 2/11/2020 #1

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

while [ -z "$vmProfil" ] || { [ "$vmProfil" != 'Prod' ] && [ "$vmProfil" != "Dev" ] && [ "$vmProfil" != "Admin" ]; }

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

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

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

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

评论

0赞 Jason 2/11/2020
我想你从这个问题中得到了反向的逻辑:“当我写'Prod'或'Dev'或'Admin'时,我会保持在循环中。
1赞 chepner 2/11/2020
这就是 OP 代码现在所做的,这与提示所暗示的相反。
0赞 Jason 2/11/2020
你是对的。OP在这个问题上的逻辑是倒退的。他试图在代码中做的逻辑是正确的。+1
0赞 Gordon Davisson 2/11/2020
此外,未加引号的变量也是一个可能的问题,尤其是在 - 它可能会起作用,但主要是偶然的。双引号变量引用以避免奇怪的解析问题。[ -z $vmProfil ]
0赞 Walter A 2/11/2020
由于报价,第一次检查是多余的。我确实喜欢案例解决方案,+1"$vmProfil"-z "$vmProfil"