不满足条件时,while循环不会退出

时间:2019-05-21 17:24:37

标签: bash while-loop

运行下面的代码时,我想读取用户输入的答案,直到它是6种可能的答案之一([abcABC])为止,否则继续下一个循环。

但是,当我输入一个已接受的答案时,它并不会退出while循环。

我尝试了[][[]]作为条件,我试图将所有条件放在一对方括号中,我尝试使用||| ,但没有一个能按预期工作。

while [ "$ans" != "a" ] || [ "$ans" != "A" ] || [ "$ans" != "b" ] || \
      [ "$ans" != "B" ] || [ "$ans" != "c" ] || [ "$ans" != "C" ]; do
    read ans

    case $ans in
      [aA]) echo "aA"         ;;
      [bB]) echo "bB"         ;;
      [cC]) echo "cC"         ;;
      *)    echo "Try again." ;;
    esac
done

它应该循环读取,直到给出一个可接受的答案为止;然后应继续以下代码(如果有)。

1 个答案:

答案 0 :(得分:2)

您的循环条件始终为真,并且Bash永远循环正确。

考虑简化版本:

[ "$ans" != "a" ] || [ "$ans" != "b" ]
  • 如果ansa,则它变为false || true,这是正确的。
  • 如果ansb,则它变为true || false,这是正确的。
  • 如果ansx,则它变为true || true,这是正确的。

您想要&&而不是||。另外,也可以一次比较:[[ "$ans" != [aAbBcC] ]]