сценарий оболочки - пока цикл не завершается - PullRequest
0 голосов
/ 05 марта 2019

У меня есть цикл while в оболочке, и он не завершается, даже несмотря на то, что он имеет условие останова, этот фрагмент кода хорошо работает на других языках, но я не могу понять, как цикл выполняется в сценарии оболочки.Вот мой код:

NAME=""
while [[ $NAME != "q"  || $NAME != "Q" ]]
do
    read NAME
    //do something


done

1 Ответ

0 голосов
/ 05 марта 2019
$NAME != "q" || $NAME != "Q"

Если NAME не может существовать в странном состоянии типа "кота Шредингера", где оно может быть одновременно Q и q , это выражение будет всегда быть правдой.

Подумайте об этом:

  • Если NAME равно , то ни q, ни Q, обавыражения будут истинными, поэтому полное выражение будет истинным.
  • Если это Q, то первые подвыражения будут истинными, что также приведет к полному выражению, являющемуся истинным.
  • Если это q, то вторые подвыражения будут истинными, что приведет к тому, что полное выражение также будет истинным.

То, что вам вероятно нужно, это:

$NAME != "q" && $NAME != "Q"

Конечно, если вы используете bash, он предоставляет способ в верхнем и нижнем регистре строки, чтобы облегчить эти сравнения:

while [[ "${NAME^^}" != "Q" ]] ; # upper-case variant
while [[ "${NAME,,}" != "q" ]] ; # lower-case variant
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...