Что означает «while:;» в смысле?

Существует diffstat , который считывает нормальный вывод diff и печатает дополнительную статистику только о строках .

diff -u fileA fileB | diffstat

или wdiff для обработки различий слов .

wdiff -123 --statistics fileA fileB

Вы также можете прочитать справочные страницы, чтобы найти еще несколько интересных опций.

27
25.05.2017, 22:06
3 ответа

а :— бесконечный цикл. :просто ничего не делает (успешно).

Итак, если вы хотите, чтобы ваша оболочка вечно зависала, ничего не делая, вы можете написать это как

while :
do
    :
done

Или в одной строке с ;вместо новой строки: while:; делать :; done

в то время как :обычно используется, если вы хотите сделать что-то повторно без присоединения специального условия. Вы можете использовать операторы continue, breakвнутри цикла, чтобы управлять им или переместить условие в конец цикла, как do ... whileконструкция .

12
27.01.2020, 19:39

однако утверждение после while должно быть либо ИСТИНА, либо ЛОЖЬ.

Нет, команда в части условия может быть любой командой(*). Всекоманды оболочки имеют какое-то возвращаемое значение, а цикл while(а также условный оператор if) принимает возвращаемые значения нуля как «истину», и все другие как «ложные». (* или список из нескольких команд, учитывается последняя)

Что касается :, руководство Bashясно говорит, что такое возвращаемый статус:

: [аргументы]
Ничего не делать, кроме расширения аргументов и выполнения перенаправлений. Статус возврата нулевой.

Встроенная команда helpеще более понятна:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.
12
27.01.2020, 19:39

Синтаксис:

while
  first list of commands
do
  second list of commands
done

запускает второй список команд в цикле до тех пор, пока первый список команд (то есть последний запуск в этом списке) успешен.

В этом первом списке командвы можете использовать команду [для выполнения различных видов тестов, или вы можете использовать команду :null, которая ничего не делает и возвращает успех или любую другую команду.

while :; do cmd; done

Запускает cmdснова и снова, так как :всегда возвращает успех. Это цикл навсегда. Вместо этого вы можете использовать команду true, чтобы сделать ее более разборчивой:

while true; do cmd; done

Раньше люди предпочитали :, поскольку :всегда было встроено, а trueне было (давным-давно; в настоящее время большинство оболочек имеют встроенную true)¹.

Другие варианты, которые вы можете увидеть:

while [ 1 ];  do cmd; done

Выше мы вызываем команду [, чтобы проверить, является ли строка «1» непустой (так что всегда верно)

while ((1)); do cmd; done

Использование синтаксис Korn/bash/zsh ((...))для имитации while(1) { ...; }of C.

Или более запутанные, такие как until false; выполнить команду; сделано, пока ! true...

Иногда их называют псевдонимами:

alias forever='while :; do'

Таким образом, вы можете сделать что-то вроде:

forever cmd; done

Мало кто понимает, что условие представляет собой списоккоманд. Например, вы видите, как люди пишут:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

В то время как они могли бы написать:

while
  cmd1
  cmd2
do
  cmd3
done

Имеет смысл использовать список, так как вы часто хотите делать такие вещи, как , в то время как cmd1 && cmd2; делать...; done, которые также являются списками команд.

В любом случае обратите внимание, что [— это такая же команда, как и любая другая (хотя она встроена в современные Bourne-подобные оболочки), ее не обязательно использовать исключительно в if/while/untilсписки условий, и эти списки условий не должны использовать эту команду чаще, чем любую другую команду.


¹ :также короче и принимает аргументы (которые игнорируются). Хотя поведение trueили falseне указано, если вы передаете ему любой аргумент. Например, можно сделать:

while : you wait; do
  something
done

Но поведение:

until false is true; do
  something
done

не указано (хотя это будет работать в большинстве реализаций оболочки/false).

51
27.01.2020, 19:39

Теги

Похожие вопросы