Що означає "while:;"?


27

Я знаю, що таке whileпетля. Однак я бачив, як це працює з:

while [condition]
while ![condition]
while TRUE (infinite loop)

Якщо заява після whileмає бути TRUEабо FALSE.

Існує вбудована команда оболонки з назвою :. Це описується як фіктивна команда, яка нічого не робить, але я не знаю, чи тут вона однакова, навіть якщо це може бути TRUEчи FALSE. Можливо, це щось інше, але що?


4
Команда :нічого не робить, але завжди виходить із поверненням коду 0. Отже, це те саме було while true(якщо у вашій системі є trueвиконуваний файл).
John1024

@ John1024 Він повертає нуль, якщо тільки оцінка його аргументів не спричинить помилку, наприклад, присвоївши значення змінній, що читається раніше.
Кусалаланда

3
@Kusalananda Так, якщо :команда ніколи не виконується, вона не поверне 0. Це, на мій погляд, надто педантично.
hvd

Відповіді:


50

Синтаксис:

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реалізацій).


12

while :є нескінченною петлею. :просто нічого не робить (успішно).

Тож якщо ви хочете, щоб ваша оболонка навісала вічно, нічого не роблячи, ви можете записати її як

while :
do
    :
done

Або в одному рядку з ;замість нових рядків:while :; do :; done

while :зазвичай використовується, якщо ви хочете щось робити повторно, не додаючи спеціальних умов. Ви можете використовувати continue, breakоператори всередині циклу , щоб контролювати його або перемістити умова в кінці циклу , як do ... whileконструкції.


12

як би там не було, вислів після цього повинен бути або ПРАВИЛЬНИМ, або ЛІЖНИМ.

Ні, командою в умовній частині може бути будь-яка команда (*) . Усі команди оболонки мають деяке повернене значення, а whileцикл (як і ifумовний) приймає повернені значення нуля як "true", а всі інші як "false". (* або список декількох команд, остання вважається)

Що стосується :, керівництво в Bash ясно говорить , що статус повернення , який:

: [arguments]
Не робіть нічого, крім розширення аргументів та виконання переадресацій. Статус повернення дорівнює нулю.

helpВбудована ще більш ясно:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

s/any command/any sequence of commands/, як це ясно говорить Стефан.
Toby Speight
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.