Я вижу такое же поведение для цикла ниже, как цикл с while [ 1 ]
. Почему это так?
while [ 0 ]; do
echo "hello"
done
Одиночные квадратные скобки в оболочке являются синонимом test
(либо отдельной команды, либо встроенной оболочки), что [ 0 ]
означает то же самое, что и test 0
. test
предназначен для сравнения и тестирования атрибутов файлов, о чем вы можете прочитать на его man-странице. Если ему не дано выражение, которое выглядит как сравнение, проверка файла или одна из других операций, которые он может выполнить, он вместо этого проверит наличие аргумента и непустую строку. Ни то, 0
ни другое не 1
являются подходящими входными данными для теста, и, поскольку проверка непустых строк просто завершается успешно, ваш цикл while зацикливается вечно.
Вы можете попробовать вместо
while false; do
echo "hello"
done
возможно замена false
на true
. Или, может быть, вы хотите использовать (( ))
:
while (( 0 )); do
echo "hello"
done
Который будет вести себя как большинство языков, где 0 означает сбой / ложь, а 1 означает успех / истина.
[ ]
(без аргумента) и[ "" ]
(с одним пустым аргументом) не удастся.0
и1
не являются пустыми строками. Новые программисты оболочки часто пишутif [ 1=2 ]
вместоif [ 1 = 2 ]
и задаются вопросом, почему первое всегда верно. Это правда, потому что это один аргумент, а не пустая строка.Здесь значение 0 действует не как числовая константа, а как строка символов. Все эти тесты эквивалентны по своему действию при получении успешного завершения статуса:
они производят неудавшийся статус завершения:
есть непустой аргумент, который оценивается как логическое истина. Это позволяет вам делать такие вещи, как:
Переменная
UNDER_NUCLEAR_ATTACK
установлена в любое непустое значение, чтобы указать истину, или не установлена или пуста, чтобы указать ложь.Мы можем применить
!
оператор, чтобы изменить логику:Чтобы оценить числовое условие, вы должны использовать числовые тестовые операторы:
Если
A
иB
содержат строки, которые выглядят как десятичные целые числа, они сравниваются как числа, и еслиA
больше чемB
, цикл выполняется. Итак, предположим, чтоUNDER_NUCLEAR_ATTACK
это не строковый логический тип, который является пустым или непустым, а фактически числовой логический тип, который имеет значение0
(false) или какое-то другое значение (true). В этом случае мы бы написали тест следующим образом:источник
Короче говоря, вы возвращаете нулевой результат теста.
http://www.tldp.org/LDP/abs/html/testconstructs.html
источник
[
получает только один аргумент (исключая]
, конечно), он выходит со статусом ноль, если аргумент не пустой, ненулевой, если это так. Так, например,[ 1 ]
также вернет код выхода0
.Значение 0 считается истинным для цикла while, поэтому условие для цикла while является истинным и, следовательно, оно непрерывно, чтобы показать бесконечный цикл. Значение true, если мы заменим 0 на 1, так как любое целое число, которое мы записываем между условием, вернет true
источник