Почему в то время как переходит в бесконечный цикл?

Я вижу то же поведение для нижнего цикла, что и цикл с while [ 1 ] . Почему это так?

 while [ 0 ]; do echo "hello" done 

  • Начиная с bash: -lt и -gt аргументы
  • Что делает ]?
  • Разница между ] и ]?
  • Тестирование строки, содержащей только пробелы (вкладки или «»)?
  • Unix - тест ksh, если несколько переменных равны 0
  • проблема с Else statment в Bash
  • Тест Bash: что делает «= ~»?
  • Почему мой скрипт вызывает несколько функций?
  • 4 Solutions collect form web for “Почему в то время как переходит в бесконечный цикл?”

    Единичные квадратные скобки в оболочке являются синонимом test (либо отдельной командой, либо встроенной оболочкой), поэтому [ 0 ] означает то же, что и test 0 . test предназначен для сравнения и тестирования атрибутов файлов, о чем вы можете прочитать в его man-странице. Когда ему не дано выражение, которое выглядит как сравнение, проверка файла или одна из других операций, которые он может выполнить, он вместо этого проверяет, присутствует ли аргумент и непустая строка. Ни один из 0 или 1 является действительно подходящим входом для теста, и как непустые тесты строк просто преуспевают, а петли while while навсегда.

    Возможно, вы захотите попробовать

     while false; do echo "hello" done 

    возможно, заменив false на true . Или, может быть, вы хотите использовать (( )) :

     while (( 0 )); do echo "hello" done 

    Который будет вести себя как большинство языков, где 0 означает отказ / ложь, а 1 означает успех / истина.

    Значение 0 здесь не действует как числовая константа, а как строка символов. Эти тесты эквивалентны в результате создания успешного статуса завершения:

     [ A ] [ "XYZ" ] [ 0 ] 

    они приводят к неудачному состоянию завершения:

     [ ] [ "" ] 

    есть непустой аргумент, который вычисляет логическую истину. Это позволяет делать такие вещи, как:

     if [ $UNDER_NUCLEAR_ATTACK ] ; then launch-missiles -a $DRY_RUN # $DRY_RUN set to "-n" during testing fi 

    Переменная UNDER_NUCLEAR_ATTACK установлена ​​на любое UNDER_NUCLEAR_ATTACK значение, указывающее true, или не задано или пустое, чтобы указать false.

    Мы можем применить ! оператор для изменения логики:

     [ ! a ] # fails: a is nonblank so true; and not true is false. [ ! ] # succeeds: blank is false, not blank is true. 

    Чтобы оценить числовое условие, вам нужно использовать числовые тестовые операторы:

      while [ $A -gt $B ] ; do ... 

    Если A и B содержат строки, которые выглядят как десятичные целые числа, они сравниваются как числа, а если A больше B , цикл выполняется. Предположим, что UNDER_NUCLEAR_ATTACK не является логическим UNDER_NUCLEAR_ATTACK типа string, который является пустым или непустым, но на самом деле является числовым логическим значением, которое является либо 0 (false), либо некоторым другим значением (true). В этом случае мы должны написать тест следующим образом:

      if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ... 

    Конструкция if / then проверяет, равен ли статус завершения списка команд 0 (поскольку 0 означает «успех» в соглашении UNIX), и если это так, выполняется одна или несколько команд.

    Короче говоря, вы возвращаете результат теста из нуля.

    http://www.tldp.org/LDP/abs/html/testconstructs.html

    Значение 0 считается истинным для цикла while, поэтому условие для цикла while истинно, и поэтому оно непрерывно отображает бесконечный цикл. Истинно, если мы заменим 0 на 1, как любое целое число, которое мы напишем между условием, которое оно вернет true

    Linux и Unix - лучшая ОС в мире.