11 ответов:
while true; do foo; sleep 2; doneкстати, если вы введете его как многострочный (как вы показываете) в командной строке, а затем вызовите историю со стрелкой вверх, вы получите ее на одной строке, правильно расставленной.
$ while true > do > echo "hello" > sleep 2 > done hello hello hello ^C $ <arrow up> while true; do echo "hello"; sleep 2; done
также можно использовать команду сна в состоянии while. Делая один лайнер выглядит более чистым имхо.
while sleep 2; do echo thinking; done
вы можете использовать точку с запятой для разделения операторов:
$ while [ 1 ]; do foo; sleep 2; done
вы также можете использовать :
until ((0)); do foo; sleep 2; doneобратите внимание, что в отличие от
while,untilбудет выполнять команды внутри цикла, пока условие теста имеет статус выхода, не ноль.
С помощью
whileпетли:while read i; do foo; sleep 2; done < /dev/urandom
С помощью
forпетли:for ((;;)); do foo; sleep 2; done
другой способ использования
until:until [ ]; do foo; sleep 2; done
Мне нравится использовать точку с запятой только для оператора WHILE, и оператор&&, чтобы сделать цикл сделать больше, чем одна вещь...
поэтому я всегда делаю это так
while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
очень простой бесконечный цикл.. :)
while true ; do continue ; doneFr ваш вопрос это будет:
while true; do foo ; sleep 2 ; done
Если я могу привести два практических примера (с небольшим количеством "эмоций").
это записывает имя всех файлов, заканчивающихся на ".jpg "в папке "img":
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; doneэтого удалить их:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; doneпросто пытаюсь внести свой вклад.
если вы хотите, чтобы цикл while, чтобы остановить после некоторого условия, и ваш
fooкоманда возвращает ненулевое значение при выполнении этого условия, то вы можете получить цикл, чтобы сломать, как это:while foo; do echo 'sleeping...'; sleep 5; done;например, если
fooкоманда удаляет вещи в пакетах,и он возвращает 1, когда нет ничего, чтобы удалить.это хорошо работает, если у вас есть пользовательский скрипт, который должен выполнить команду много раз, пока некоторое условие. Вы пишете сценарий для выхода с помощью
1когда условие выполнено и выход с0когда он должен быть запущен снова.например, скажем, у вас есть скрипт python
batch_update.pyкакое обновление 100 строк в базе данных и возвращает0если есть больше, чтобы обновить и1если их больше нет. Следующая команда позволит вам обновлять строки 100 одновременно со сном в течение 5 секунд между обновлениями:while batch_update.py; do echo 'sleeping...'; sleep 5; done;
вы можете попробовать это тоже Предупреждение: это вы не должны делать, но так как вопрос задает бесконечный цикл без конца...это, как вы могли бы это сделать.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done
Comments