Синтаксис однострочного цикла while в Bash
Я сталкиваюсь с проблемой в составлении правильной комбинации точек с запятой и/или фигурных скобок. Я хотел бы выполнить следующий код в одну строку из командной строки:
while [ 1 ]
do
foo
sleep 2
done
Как мне это сделать?
5 ответ(ов)
Ваш код while true; do foo; sleep 2; done
представляет собой бесконечный цикл в Bash, который выполняет команду foo
, затем делает паузу на 2 секунды. После завершения первой итерации цикл повторяется без остановки.
Если вы хотите ввести этот код в командной строке в формате многострочного ввода, вы можете сделать это следующим образом:
$ while true
> do
> echo "hello"
> sleep 2
> done
При этом после выполнения команды, если вы нажмете стрелку вверх на клавиатуре, то получите код в однострочном формате:
$ <arrow up> while true; do echo "hello"; sleep 2; done
Это удобно, если вы хотите быстро повторно ввести команду в сжатом виде. Помните, что такой бесконечный цикл будет работать до тех пор, пока вы его не прервете (например, с помощью Ctrl+C
).
Да, вы правы! Также можно использовать команду sleep
в условии while
, что делает однострочник более чистым, на мой взгляд. Вот пример:
while sleep 2; do echo thinking; done
В этом случае цикл будет выполняться каждые 2 секунды, и на каждой итерации выводится сообщение "thinking". Это может быть полезно для создания простых ожиданий между выполнением каких-либо задач.
В данном случае используется конструкция while :;
в Bash. Двоеточие :
— это встроенная команда, которая всегда возвращает "true" (истину). Следовательно, цикл while :; do foo; sleep 2; done
будет выполняться бесконечно, пока вы вручную не прервете его (например, нажав Ctrl+C
).
Здесь foo
— это команда или функция, которую вы хотите выполнять в цикле, а sleep 2
делает паузу в 2 секунды между итерациями. Таким образом, каждый раз после выполнения foo
программа будет ждать 2 секунды, прежде чем начать следующий цикл.
Это часто используется для создания бесконечных циклов, когда вам нужно повторять действие с определенной задержкой.
Вы можете использовать точки с запятой для разделения команд:
while [ 1 ]; do foo; sleep 2; done
В этом примере цикл будет выполняться бесконечно, вызывая команду foo
и приостанавливая выполнение на 2 секунды между итерациями.
Вы также можете использовать команду 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
Итерация через свойства объекта
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?