Существует diffstat
, который считывает нормальный вывод diff
и печатает дополнительную статистику только о строках .
diff -u fileA fileB | diffstat
или wdiff
для обработки различий слов .
wdiff -123 --statistics fileA fileB
Вы также можете прочитать справочные страницы, чтобы найти еще несколько интересных опций.
а :
— бесконечный цикл. :
просто ничего не делает (успешно).
Итак, если вы хотите, чтобы ваша оболочка вечно зависала, ничего не делая, вы можете написать это как
while :
do
:
done
Или в одной строке с ;
вместо новой строки: while:; делать :; done
в то время как :
обычно используется, если вы хотите сделать что-то повторно без присоединения специального условия. Вы можете использовать операторы continue
, break
внутри цикла, чтобы управлять им или переместить условие в конец цикла, как do ... while
конструкция .
однако утверждение после while должно быть либо ИСТИНА, либо ЛОЖЬ.
Нет, команда в части условия может быть любой командой(*). Всекоманды оболочки имеют какое-то возвращаемое значение, а цикл while
(а также условный оператор if
) принимает возвращаемые значения нуля как «истину», и все другие как «ложные». (* или список из нескольких команд, учитывается последняя)
Что касается :
, руководство Bashясно говорит, что такое возвращаемый статус:
: [аргументы]
Ничего не делать, кроме расширения аргументов и выполнения перенаправлений. Статус возврата нулевой.
Встроенная команда help
еще более понятна:
$ help :
[...]
No effect; the command does nothing
Exit Status:
Always succeeds.
Синтаксис:
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
).