Синтаксис для однострочного цикла bash infinite while
У меня возникли проблемы с правильной комбинацией точек с запятой и/или фигурных скобок. Я бы хотел это сделать, но как однострочный из командной строки:
while [ 1 ]
do
foo
sleep 2
done
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 ; done
Fr ваш вопрос будет:
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