Solaris grep и регулярные выражения?

Синтаксис:

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).

1
29.08.2017, 14:03
0 ответов

Теги

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