У меня возникают проблемы с правильной комбинацией точек с запятой и/или фигурными скобками. Я хотел бы сделать это, но как однострочный из командной строки:
while [ 1 ]
do
foo
sleep 2
done
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
cmdhist
если вы используете bash?
Также можно использовать команду sleep во время условия. Сделать однострочный слой более чистым imho.
while sleep 2; do echo thinking; done
Колон всегда "истинно":
while :; do foo; sleep 2; done
: [arguments]
Нет эффекта; команда не делает ничего, кроме расширения аргументов и выполнения любых указанных перенаправлений. Возвращается нулевой код выхода.
Вы можете использовать точки с запятой для разделения операторов:
$ while [ 1 ]; do foo; sleep 2; done
Вы также можете использовать команду 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
Мне нравится использовать точки с запятой только для инструкции 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
&&
в цикле такое же, как и в любое другое время, не так ли. Нужно ли, чтобы второе происходило только в том случае, если первое происходит, тогда используйте &&
else ;
достаточно. На самом деле вы хотите, чтобы содержимое этого цикла было коротким и простым, в идеале всего одна команда, то есть функция или скрипт.
Очень простой бесконечный цикл...:)
while true ; do continue ; done
Отправляй свой вопрос:
while true; do foo ; sleep 2 ; done
Для простого просмотра процесса используйте watch
вместо
Вы можете попробовать это тоже
while [[ 0 -ne 1 ]]; do echo "it looping"; 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
Просто пытаюсь внести свой вклад.
for f in *.jpg; do echo $f; done
ls -1 *.jpg
и rm *.jpg
Если вы хотите, чтобы цикл while остановился после некоторого условия, и ваша команда foo
возвращает ненулевое значение, когда это условие выполняется, вы можете заставить цикл разбиться следующим образом:
while foo; do echo 'sleeping...'; sleep 5; done;
Например, если команда foo
удаляет вещи партиями, и она возвращает 1, когда ничего не удаётся удалить.
foo
с кодом 1
когда хотите, чтобы цикл while прервался. Я обновил свой ответ с примером.