цикл while не завершается, когда условие не выполняется - PullRequest
0 голосов
/ 21 мая 2019

При выполнении приведенного ниже кода я хотел бы прочитать ответ, введенный пользователем, пока он не станет одним из 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 Ответ

2 голосов
/ 21 мая 2019

Ваше условие цикла всегда верно, и Bash правильно зацикливается навсегда.

Рассмотрим упрощенную версию:

[ "$ans" != "a" ] || [ "$ans" != "b" ]
  • Если ans равно a, тогда оно становится false || true, что соответствует действительности.
  • Если ans равно b, тогда оно становится true || false, что верно.
  • Если ans равно x, тогда оно становится true || true, что является истинным.

Вы хотели && вместо ||. Или же сделайте это в одном сравнении: [[ "$ans" != [aAbBcC] ]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...