Я знаю, что while
такое цикл. Однако я видел, как он работает только с:
while [condition]
while ![condition]
while TRUE (infinite loop)
Где после оператора while
должно стоять либо , TRUE
либо FALSE
.
Есть встроенная в оболочку команда с именем :
. Она описывается как пустая команда, ничего не делающая, но я не знаю, то же ли это здесь, даже если это может быть TRUE
или FALSE
. Может быть, это что-то другое, но что?
решение1
Синтаксис следующий:
while
first list of commands
do
second list of commands
done
который запускает второй список команд в цикле до тех пор, пока первый список команд (то есть последний запуск в этом списке) будет успешным.
В этомпервый список команд, вы можете использовать [
команду для выполнения различных видов тестов или использовать :
команду null, которая ничего не делает и возвращает результат, или любую другую команду.
while :; do cmd; done
Пробегает cmd
снова и снова вечно, как :
всегда возвращает успех. Этонавсегдаloop. true
Вместо этого вы можете использовать команду, чтобы сделать ее более разборчивой:
while true; do cmd; done
Раньше люди предпочитали, :
чтобы as :
всегда был встроенным, а true
was — нет (давно; true
сейчас большинство оболочек имеют встроенный вариант)¹.
Другие варианты, которые вы можете увидеть:
while [ 1 ]; do cmd; done
Выше мы вызываем [
команду, чтобы проверить, является ли строка «1» непустой (то есть всегда true)
while ((1)); do cmd; done
Использование синтаксиса Korn/bash/zsh ((...))
для имитации языка while(1) { ...; }
C.
Или более запутанные, например until false; do cmd; done
, until ! true
...
Иногда их называют так:
alias forever='while :; do'
Итак, вы можете сделать что-то вроде:
forever cmd; done
Мало кто понимает, что это состояниесписоккоманд. Например, вы видите, как люди пишут:
while :; do
cmd1
cmd2 || break
cmd3
done
Когда они могли бы написать:
while
cmd1
cmd2
do
cmd3
done
Имеет смысл, чтобы это былосписокпоскольку вам часто требуется делать что-то вроде while cmd1 && cmd2; do...; done
списков команд.
В любом случае, обратите внимание, что это [
такая же команда, как и любая другая (хотя она встроена в современные оболочки типа Bourne), ее не обязательно использовать исключительно в списках условий if
// , и эти списки условий не обязательно должны использовать эту команду чаще, чем любую другую команду.while
until
¹ :
также короче и принимает аргументы (которые игнорирует). В то время как поведение true
or false
не определено, если вы передаете ему любой аргумент. Так что можно сделать, например:
while : you wait; do
something
done
Но поведение:
until false is true; do
something
done
не определено (хотя это будет работать в большинстве false
реализаций shell).
решение2
while :
бесконечный цикл. :
просто ничего не делает (успешно).
Так что если вы хотите, чтобы ваша оболочка зависла навсегда, ничего не делая, вы можете записать это так:
while :
do
:
done
Или в одну строку ;
вместо символов новой строки:while :; do :; done
while :
обычно используется, если вы хотите сделать что-то повторно без специального условия. Вы можете использовать операторы continue
, break
внутри цикла, чтобы управлять им или переместить условие в конец цикла как do ... while
конструкцию.
решение3
Однако утверждение после while должно быть либо ИСТИННЫМ, либо ЛОЖНЫМ.
Нет, команда в условной части может быть любой командой (*) .ВсеКоманды оболочки имеют некоторое возвращаемое значение, и while
цикл (а также if
условный оператор) принимает возвращаемые значения ноль как «истина», а все остальные как «ложь». (* или список из нескольких команд, последняя считается)
Что касается :
,Руководство Башаясно говорит, каков статус возврата этого:
: [arguments]
Ничего не делать, кроме расширения аргументов и выполнения перенаправлений. Статус возврата — ноль.
Встроенная функция help
еще более понятна:
$ help :
[...]
No effect; the command does nothing
Exit Status:
Always succeeds.