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

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

 while [ 0 ]; do echo "hello" done 

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

  • ожидаемое целочисленное выражение
  • Настройка зашифрованных папок с помощью ecryptfs на Raspbian
  • арифметическая синтаксическая ошибка в сравнении строк
  • Как я могу создать скрипт bash, который запускает irb, а затем некоторый код ruby?
  • Тестирование строки, содержащей только пробелы (вкладки или «»)?
  • Unix - тест ksh, если несколько переменных равны 0
  • Как проверить, является ли файл символической ссылкой на каталог?
  • проблема с Else statment в Bash
  • Оператор if и else с использованием diff -q
  • 0 байт, созданный в простом скрипте
  • bash howto script - если нет ответа или ответа mutliline
  • "Test -n && echo not empty" печатает "not empty". Это ожидаемое поведение?
  • Interesting Posts

    Sftp: локальный удален?

    Как узнать, какие файлы использует Makefile?

    Как запустить XTerm с подсказкой внизу?

    Создание файла журнала за итерацию цикла (bash)?

    применять правила в списке файлов в GNU Make (или «для» инструкции в GNU Make)

    Переменная пустая, когда используется в выражении if, но не echo

    Сценарий Bash возвращает «команда не найдена», если вне исходной папки

    Должен ли я использовать / dev / sda или / dev / sdb в fstab при загрузке с USB?

    Ubuntu remaster создает слишком маленькие ISO

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

    Разрешить su без пароля для пользователей в определенной группе Active Directory при использовании pam_winbind

    Ошибка tkdiff в Linux Redhat 5.5

    Почему другой пользователь не может получить доступ к моему файлу, когда это полный путь?

    Почему не удается выполнить поиск содержимого текстового файла, закодированного в UTF-16?

    офис 2007 под вином: доступен для всех учетных записей пользователей?

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