Синтаксис:
while
first list of commands
do
second list of commands
done
який запускає другий список команд у циклі до тих пір, поки перший список команд (тому останній запуск у цьому списку) є успішним.
У цьому першому списку команд ви можете використовувати [
команду для виконання різного роду тестів, або ви можете використовувати команду :
null, яка нічого не робить і повертає успіх, або будь-яку іншу команду.
while :; do cmd; done
Бігає cmd
знову і знову назавжди, як :
завжди повертає успіх. Це вічно петля. Ви можете скористатися true
командою замість цього, щоб зробити її більш розбірливою:
while true; do cmd; done
Люди вважали за краще, :
як :
завжди будувались в той час, як true
його не було (давно; в даний час більшість снарядів true
побудовано) ¹.
Інші варіанти, які ви можете побачити:
while [ 1 ]; do cmd; done
Вище ми викликаємо [
команду, щоб перевірити, чи рядок "1" не порожній (так завжди також вірно)
while ((1)); do cmd; done
Використання ((...))
синтаксису Korn / bash / zsh для імітації while(1) { ...; }
C.
Або більш перекручені, такі як until false; do cmd; done
, until ! true
...
Вони іноді псевдоніми на зразок:
alias forever='while :; do'
Тож ви можете зробити щось на кшталт:
forever cmd; done
Мало хто розуміє, що умовою є список команд. Наприклад, ви бачите людей, які пишуть:
while :; do
cmd1
cmd2 || break
cmd3
done
Коли вони могли написати:
while
cmd1
cmd2
do
cmd3
done
Це має сенс бути списком, оскільки ви часто хочете робити такі речі, як while cmd1 && cmd2; do...; done
командні списки.
У будь-якому випадку, зауважте, що [
це команда, як і будь-яка інша (хоча вона вбудована в сучасні оболонки Борна), вона не повинна використовуватися виключно у списках if
/ while
/ until
умови, і ці списки умов не мають використовувати цю команду більше, ніж будь-яка інша команда.
¹ :
також коротше і приймає аргументи (які він ігнорує). Хоча поведінка true
або false
не визначено, якщо ви передаєте їй якийсь аргумент. Так можна зробити, наприклад:
while : you wait; do
something
done
Але поведінка:
until false is true; do
something
done
не визначено (хоча це працювало б у більшості оболонок / false
реалізацій).
:
нічого не робить, але завжди виходить із поверненням коду 0. Отже, це те саме булоwhile true
(якщо у вашій системі єtrue
виконуваний файл).