Цикли и разклонения
Контролирането на потока на изпълнение е един от ключовите аспекти на структурната организация на скриптове на черупки. Цикли и скокове са онези инструменти, които осигуряват контрол върху реда на изпълнение на командите.
Цикълът е блок от команди, който се изпълнява многократно, докато не бъде изпълнено условието за излизане от цикъла.
за цикли
Това е един от основните видове цикли. И се различава значително от своя аналог в C.
При всяко преминаване на цикъла променливата аргумент на цикъла arg последователно, една по една, приема стойности от списъчния списък.
Елементите от списъка могат да включват заместващи символи.
Ако ключовата дума го направи е на същата линия като за, след това след списъка с аргументи (преди да направите) трябва да поставите точка и запетая.
Пример 10-1. Обикновено за цикъл
Всеки от елементите [списък] може да съдържа множество аргументи. Това е полезно при обработка на групи параметри. В този случай, за да принудите да анализирате всеки от аргументите в списъка, трябва да използвате оператора set (виж пример 11-13).
Пример 10-2. Цикъл For с два параметъра във всеки от елементите в списъка
Като списък, в цикъл for, можете да използвате променлива.
Пример 10-3. Fileinfo: обработка на списък с файлове в променлива
IN [списък] за цикъл могат да се използват имена на файлове, които от своя страна могат да съдържат заместващи символи.
Пример 10-4. Обработка на списък с файлове в цикъл for
Ако [списък] в цикъла for не е зададена, тогава като нея се използва променливата $ @ - списъкът с аргументи на командния ред. Много хитро тази характеристика е илюстрирана в пример A-18.
Пример 10-5. За цикъл без списък с аргументи
При създаване на списък с аргументи е разрешено заместване на команди в цикъл for. Вижте пример 12-39, пример 10-10 и пример 12-33.
Пример 10-6. Създаване на списък с аргументи в For Loop с помощта на заместване на команди
По-сложен пример за използване на заместване на команди при създаване на списък с аргументи на цикъл.
Пример 10-7. grep за двоични файлове
Още един пример.
Пример 10-8. Списък на всички потребители на системата
И последен пример за използване на заместване на команди при създаване на [списък].
Резултатът от цикъла for може да се подава към други команди.
Пример 10-10. Списък със символни връзки в директорията
Изходът на цикъла може да бъде пренасочен от stdout към файл, по-долу е малко модифицирана версия на предишния пример, която демонстрира тази възможност.
Пример 10-11. Списък със символни връзки в директория, съхранявани във файл
За циклов оператор има алтернативен синтаксис на нотация - много подобен на синтаксиса на израза for в езика C. За това се използват двойни скоби.
Пример 10-12. C-подобен синтаксис на оператора за цикъл for
А сега пример за скрипт, който може да намери „реална“ употреба.
Пример 10-13. Работа с командата efax в групов режим
Операторът while проверява състоянието преди началото на всяка итерация и ако условието е вярно (ако кодът за връщане е 0), тогава контролът се прехвърля в тялото на цикъла. За разлика от цикли, докато цикли се използват в случаите, когато броят на итерациите не е известен предварително.
Моля, обърнете внимание: в някои случаи, като например използване на конструкцията на getopts във връзка с изявлението while, синтаксисът е малко по-различен от този, даден тук.
Пример 10-14. Обикновен цикъл while
Пример 10-15. Друг пример за цикъл while
Докато изявление може да има няколко условия. Но само последният от тях определя възможността за продължаване на цикъла. В този случай синтаксисът на цикличния оператор трябва да е малко по-различен.
Пример 10-16. Цикъл while с множество условия
Както и за, докато цикъл може да се напише в С-подобна нотация, като се използват двойни скоби (вж. също Пример 9-28).
Пример 10-17. Синтаксис, подобен на C за цикъла while
Стандартен вход stdin, за известно време, може да бъде пренасочен към файл с помощта на командата till redirection
До цикъл оператор проверява състоянието в началото на всяка итерация, но за разлика от while итерацията е възможна само ако условието е невярно.
Забележка: операторът до проверява състоянието на края на цикъла ПРЕДИ следващата итерация, а не след, както е обичайно в някои езици за програмиране.