8

Синтаксис однострочного цикла while в Bash

8

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

while [ 1 ]
do
    foo
    sleep 2
done

Как мне это сделать?

5 ответ(ов)

16

Ваш код 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).

2

Да, вы правы! Также можно использовать команду sleep в условии while, что делает однострочник более чистым, на мой взгляд. Вот пример:

while sleep 2; do echo thinking; done

В этом случае цикл будет выполняться каждые 2 секунды, и на каждой итерации выводится сообщение "thinking". Это может быть полезно для создания простых ожиданий между выполнением каких-либо задач.

0

В данном случае используется конструкция while :; в Bash. Двоеточие : — это встроенная команда, которая всегда возвращает "true" (истину). Следовательно, цикл while :; do foo; sleep 2; done будет выполняться бесконечно, пока вы вручную не прервете его (например, нажав Ctrl+C).

Здесь foo — это команда или функция, которую вы хотите выполнять в цикле, а sleep 2 делает паузу в 2 секунды между итерациями. Таким образом, каждый раз после выполнения foo программа будет ждать 2 секунды, прежде чем начать следующий цикл.

Это часто используется для создания бесконечных циклов, когда вам нужно повторять действие с определенной задержкой.

0

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

while [ 1 ]; do foo; sleep 2; done

В этом примере цикл будет выполняться бесконечно, вызывая команду foo и приостанавливая выполнение на 2 секунды между итерациями.

0

Вы также можете использовать команду 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
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь