Что означает «while :;»?

Что означает «while :;»?

Я знаю, что 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 :всегда был встроенным, а truewas — нет (давно; 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// , и эти списки условий не обязательно должны использовать эту команду чаще, чем любую другую команду.whileuntil


¹ :также короче и принимает аргументы (которые игнорирует). В то время как поведение trueor 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.

Связанный контент