Синтаксис для однострочного цикла 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

двоеточие всегда "true":

while :; do foo; sleep 2; 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

для простого просмотра используйте watch вместо


Если я могу дать два практических примера (с немного "эмоций").

это записывает имя всех файлов, заканчивающихся на ".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