робити… поки або робити… до тих пір, поки в скрипті оболонки POSIX


16

Існує добре відомий while condition; do ...; doneцикл, але чи існує do... whileцикл стилів, який гарантує принаймні одне виконання блоку?


Дуже дякую Шоу, я не очікував, що відповідь настільки швидко стане обраною відповіддю. Отже: дякую за відбір.

Відповіді:


15

Дуже універсальна версія A do ... whileмає таку структуру:

while 
      Commands ...
do :; done

Приклад:

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

Як це (для нього не встановлено значення i) цикл виконується 20 разів.
UN-Коментуючи рядок, який задано i16 i=16, цикл виконується 4 рази.
Для i=16, i=17, i=18і i=19.

Якщо i встановлено (скажімо, 26) в ту саму точку (початок), команди все-таки виконуються вперше (поки не буде перевірена команда розриву циклу).

Тест на деякий час повинен бути правдивим (статус виходу 0).
Тест повинен бути перетворений на цикл до, тобто: бути фальшивим (статус виходу не 0).

Для роботи версії POSIX потрібно кілька елементів, змінених для роботи:

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 

Майте на увазі, що якщо ви використовуєте що- set -eнебудь невдале всередині блоку, поки умовний блок не зупинить виконання: напр. set -e; while nonexistentcmd; true; do echo "SHiiiiit"; exit 3; done-> shit відбувається. Отже, якщо ви користуєтесь цим, ви повинні бути дуже обережними в роботі з помилками, тобто ланцюжок всіх команд &&!
Тимо

17

Існує не робити ... поки або робити ... до циклу, але те ж саме можна зробити так:

while true; do
  ...
  condition || break
done

до:

until false; do
  ...
  condition && break
done

Ви можете використовувати будь-яку з ліній перерви з будь-якою з петель - тоді як true або поки false просто означають "навіки". Я розумію, це ніби зберігає час-ність або до-носс, щоб мати умови щасливого виходу або сумного виходу.
android.weasel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.