it-roy-ru.com

Синтаксис для однострочного бесконечного цикла Bash

У меня возникают проблемы с правильным сочетанием точек с запятой и/или фигурных скобок. Я хотел бы сделать это, но в качестве одной строки из командной строки:

while [ 1 ]
do
    foo
    sleep 2
done
555
Brian Deacon
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
1073
Stefano Borini

Также возможно использовать команду сна в состоянии while. Делать однострочник более чистым imho.

while sleep 2; do echo thinking; done
154
Anssi

Двоеточие всегда "верно"

while :; do foo; sleep 2; done
66
ajaaskel

Вы можете использовать точки с запятой для разделения операторов:

$ while [ 1 ]; do foo; sleep 2; done
27
mipadi

Вы также можете использовать команду until:

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
27
devnull

Очень простой бесконечный цикл .. :)

while true ; do continue ; done

На ваш вопрос это будет так:

while true; do foo ; sleep 2 ; done
9
Mack

Мне нравится использовать точки с запятой только для оператора 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
8
Thomas

Для простого наблюдения за процессом используйте вместо этого watch

6
Christian Schwarz

Если вы хотите, чтобы цикл 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;
3
Yep_It's_Me

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

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

Просто пытаюсь внести свой вклад.

2
Roger

Вы можете попробовать это тоже ВНИМАНИЕ: этого делать не следует, но поскольку вопрос заключается в бесконечном цикле без конца ... это то, как вы можете это сделать.

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done
2
grepit

Использование while:

while true; do echo 'while'; sleep 2s; done

Использование for Loop:

for ((;;)); do echo 'forloop'; sleep 2; done

Использование Recursion (немного отличается от описанного выше, прерывание клавиатуры не остановит его)

list(){ echo 'recursion'; sleep 2; list; } && list;
1
msoliman