提问人:Boris 提问时间:2/11/2020 最后编辑:CyrusBoris 更新时间:2/11/2020 访问量:978
Bash while 循环中的多个条件
Bash Multiple conditions in while loop
问:
我正在尝试在使用四个条件的 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
答:
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"
评论