Управление ходом исполнения — один из ключевых моментов структурной организации сценариев на языке командной оболочки. Циклы и преходы являются теми инструментальными средствами, которые обеспечивают управление порядком исполнения команд.
10.1. Циклы
Цикл — это блок команд, который исполняется многократно до тех пор, пока не будет выполнено условие выхода из цикла.
циклы for
Это одна из основных разновидностей циклов. И она значительно отличается от аналога в языке C.
На каждом проходе цикла, переменная-аргумент цикла arg последовательно, одно за другим, принимает значения из списка list.
Элементы списка могут включать в себя шаблонные символы.
Есл ключевое слово do находится в одной строке со словом for, то после списка аргументов (перед do) необходимо ставить точку с запятой.
Пример 10-1. Простой цикл for
Каждый из элементов [списка] может содержать несколько аргументов. Это бывает полезным при обработке групп параметров. В этом случае, для принудительного разбора каждого из аргументов в списке, необходимо использовать инструкцию set (см. Пример 11-13).
Пример 10-2. Цикл for с двумя параметрами в каждом из элементов списка
В качестве списка, в цикле for, можно использовать переменную.
Пример 10-3. Fileinfo: обработка списка файлов, находящегося в переменной
В [списке] цикла for могут быть использованы имена файлов, которые в свою очередь могут содержать символы-шаблоны.
Пример 10-4. Обработка списка файлов в цикле for
Если [список] в цикле for не задан, то в качестве оного используется переменная $@ — список аргументов командной строки. Оень остроумно эта особенность проиллюстрирована в Пример A-18.
Пример 10-5. Цикл for без списка аргументов
При создании списка аргументов, в цикле for допускается пользоваться подстановкой команд. См. Пример 12-39, Пример 10-10 и Пример 12-33.
Пример 10-6. Создание списка аргументов в цикле for с помощью операции подстановки команд
Более сложный пример использования подстановки команд при создании списка аргументов цикла.
Пример 10-7. grep для бинарных файлов
Еще один пример.
Пример 10-8. Список всех пользователей системы
И заключительный пример использования подстановки команд при создании [списка].
Пример 10-9. Проверка авторства всех бинарных файлов в текущем каталоге
Результат работы цикла for может передаваться другим командам по конвейеру.
Пример 10-10. Список символических ссылок в каталоге
Вывод цикла может быть перенаправлен со stdout в файл, ниже приводится немного модифицированный вариант предыдущего примера, демонстрирующий эту возможность.
Пример 10-11. Список символических ссылок в каталоге, сохраняемый в файле
Оператор цикла for имеет и альтернативный синтаксис записи — очень похожий на синтаксис оператора for в языке C. Для этого используются двойные круглые скобки.
Пример 10-12. C-подобный синтаксис оператора цикла for
А сейчас пример сценария, который может найти «реальное» применение.
Пример 10-13. Работа с командой efax в пакетном режиме
Оператор while проверяет условие перед началом каждой итерации и если условие истинно (если код возврата равен 0 ), то управление передается в тело цикла. В отличие от циклов for, циклы while используются в тех случаях, когда количество итераций заранее не известно.
Как и в случае с циклами for/in , при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ «;» перед do.
Обратите внимание: в отдельных случаях, таких как использование конструкции getopts совместно с оператором while, синтаксис несколько отличается от приводимого здесь.
Пример 10-14. Простой цикл while
Пример 10-15. Другой пример цикла while
Оператор while может иметь несколько условий. Но только последнее из них определяет возможность продолжения цикла. В этом случае синтаксис оператора цикла должен быть несколько иным.
Пример 10-16. Цикл while с несколькими условиями
Как и в случае с for, цикл while может быть записан в C-подобной нотации, с использованием двойных круглых скобок (см. так же Пример 9-28).
Пример 10-17. C-подобный синтаксис оформления цикла while
Стандартное устройство ввода stdin, для цикла while, можно перенаправить на файл с помощью команды перенаправления в конце цикла.
Оператор цикла until проверяет условие в начале каждой итерации, но в отличие от while итерация возможна только в том случае, если условие ложно.
Обратите внимание: оператор until проверяет условие завершения цикла ПЕРЕД очередной итерацией, а не после, как это принято в некоторых языках программирования.
Как и в случае с циклами for/in , при размещении ключевого слова do в одной строке с объявлением цикла, необходимо вставлять символ «;» перед do.
Источник
Цикл while в Bash
Циклы — одна из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите выполнить серию команд несколько раз, пока не будет выполнено определенное условие.
В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач. В Bash сценариях доступны такие циклы как for, while, и until.
В этом руководстве рассматриваются основы циклов while в Bash. Мы также покажем вам, как использовать операторы break и continue чтобы изменить ход цикла.
while цикл
В while цикл используется для выполняет заданный набор команд неизвестное число раз до тех пор , как данное условие принимает значение истинно.
Цикл while Bash имеет следующую форму:
Оператор while начинается с ключевого слова while , за которым следует условное выражение.
Условие оценивается перед выполнением команд. Если условие истинно, команды выполняются. В противном случае, если условие оценивается как ложное, цикл завершается, и управление программой будет передано следующей команде.
В приведенном ниже примере на каждой итерации текущее значение переменной i печатается и увеличивается на единицу.
Цикл вторника повторяется до тех пор, пока i меньше или равно двум. Он выдаст следующий результат:
Бесконечный цикл while
Бесконечный цикл — это цикл, который повторяется бесконечно и никогда не завершается. Если условие всегда истинно, вы получаете бесконечный цикл.
В следующем примере мы используем встроенную команду : для создания бесконечного цикла. : всегда возвращает истину. Вы также можете использовать true встроенный или любой другой оператор, который всегда возвращает true.
В while цикл выше будет работать до бесконечности. Вы можете прервать цикл, нажав CTRL+C
Вот однострочный эквивалент:
Прочитать файл построчно
Одним из наиболее распространенных использований в while петли , чтобы прочитать файл, поток данных или переменной построчно.
Вот пример, который считывает файл /etc/passwd построчно и печатает каждую строку:
Вместо того , чтобы контролировать while цикл с условием, что мы используем перенаправления ввода ( ) , чтобы передать файл на read команды, которая контролирует цикл. В while цикл будет выполняться до тех пор , последняя строка не читается.
При чтении файла построчно всегда используйте read с опцией -r чтобы обратная косая черта не использовалась как escape-символ.
По умолчанию команда read обрезает начальные / конечные пробельные символы (пробелы и табуляции). Используйте параметр IFS= перед read чтобы предотвратить такое поведение:
break и continue
Операторы break и continue могут использоваться для управления выполнением цикла while.
break
Оператор break завершает текущий цикл и передает управление программой команде, которая следует за завершенным циклом. Обычно он используется для завершения цикла при выполнении определенного условия.
В следующем примере выполнение цикла будет прервано, когда текущий повторяемый элемент станет равным 2 .
continue
Оператор continue завершает текущую итерацию цикла и передает управление программой следующей итерации цикла.
В нижеследующем ниже, как только текущий повторяемый элемент равен 2 оператор continue заставит выполнение вернуться к началу цикла и продолжить следующую итерацию.
Выводы
В while цикл многократно выполняет заданный набор команд до тех пор , как условие истинно.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
for цикл в Bash
Циклы — одна из фундаментальных концепций языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет достигнуто определенное условие.
В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач. В Bash доступны три основные конструкции цикла: for , while и until циклы.
В этом руководстве мы рассмотрим основы циклов for в Bash. Мы также покажем вам, как использовать операторы break и continue чтобы изменить ход цикла.
Стандартный for цикл в Bash
Цикл for выполняет итерацию по списку элементов и выполняет заданный набор команд.
Цикл for Bash имеет следующую форму:
Список может быть серией строк, разделенных пробелами, диапазоном чисел, выводом команды, массивом и т. Д.
Оберните струны
В приведенном ниже примере цикл будет перебирать каждый элемент в списке строк, и переменный element будет установлен на текущий элемент:
Цикл выдаст следующий результат:
Цикл по диапазону чисел
Вы можете использовать выражение последовательности, чтобы указать диапазон чисел или символов, задав начальную и конечную точки диапазона. Выражение последовательности принимает следующую форму:
Вот пример цикла, который перебирает все числа от 0 до 3:
Начиная с Bash 4, также можно указывать приращение при использовании диапазонов. Выражение принимает следующий вид:
Вот пример, показывающий, как увеличить на 5:
Перебирать элементы массива
Вы также можете использовать цикл for для перебора массива элементов.
В приведенном ниже примере мы определяем массив с именем BOOKS и перебираем каждый элемент массива.
Цикл for в Bash в стиле C
Синтаксис цикла for стиле C имеет следующий вид:
Часть INITIALIZATION выполняется только один раз при запуске цикла. Затем оценивается TEST . Если это ложь, цикл прекращается. Если TEST истинен, команды внутри цикла for выполняются, а часть STEP обновляется.
В следующем примере кода цикл начинается с инициализации i = 0 и перед каждой итерацией проверяется, является ли i ≤ 10 . Если true, он печатает текущее значение i и [увеличивает переменную] i на 1 ( i++ ), в противном случае цикл завершается.
Цикл повторится 1001 раз и выдаст следующий результат:
Операторы break и continue
Операторы break и continue могут использоваться для управления выполнением цикла for.
Оператор break
Оператор break завершает текущий цикл и передает управление программой оператору, следующему за завершенным оператором. Обычно он используется для завершения цикла при выполнении определенного условия.
В следующем примере мы используем оператор if для прекращения выполнения цикла, когда текущий повторяемый элемент становится равным «Lithium».
Оператор continue
Оператор continue завершает текущую итерацию цикла и передает управление программой следующей итерации цикла.
В следующем примере мы перебираем диапазон чисел. Когда текущий повторяемый элемент равен ‘2’, оператор continue заставит выполнение вернуться к началу цикла и продолжить следующую итерацию:
Примеров циклов for в Bash
Переименование файлов с пробелами в имени файла
В следующем примере показано, как переименовать все файлы в текущем каталоге с пробелом в его именах, заменив пробел на подчеркивание:
Давайте разберем код построчно:
Первая строка создает цикл for и выполняет итерацию по списку всех файлов с пробелом в имени. Выражение * * создает список.
Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя пробел знаком подчеркивания ( _ ). Часть $ использует расширение параметра оболочки для замены шаблона в параметре строкой.
done указывает конец сегмента цикла.
Изменение расширения файла
В следующем примере показано, как использовать цикл for в Bash for переименования всех файлов, оканчивающихся на .jpeg, в текущем каталоге путем замены расширения файла с .jpeg на .jpg.
Давайте проанализируем код построчно:
Первая строка создает цикл for и выполняет итерацию по списку всех файлов, заканчивающихся на ‘.jpeg’.
Вторая строка применяется к каждому элементу списка и перемещает файл в новый, заменяя «.jpeg» на «.jpg». $ чтобы удалить часть ‘.jpeg’ из имени файла, используя расширение параметра оболочки
done указывает конец сегмента цикла.
Выводы
Цикл for Bash используется для повторного выполнения заданного набора команд определенное количество раз.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
Циклы Bash
В этой статье мы продолжим наш цикл про написание скриптов на Bash. Мы уже рассмотрели как работать с архивами и создавать функции, но этого еще недостаточно. Любой уважающий себя язык программирования должен содержать циклы. Цикл — это такая последовательность, которая позволяет выполнять определенный участок кода необходимое количество раз.
С помощью циклов вы можете очень сильно сократить количество строк кода, которые необходимо написать для однотипных операций. В этой статье мы рассмотрим что такое циклы Bash, как их создавать и использовать.
Циклы Bash
Как я уже сказал, циклы позволяют выполнять один и тот же участок кода необходимое количество раз. В большинстве языков программирования существует несколько типов циклов. Большинство из них поддерживаются оболочкой Bash. Мы рассмотрим их все в сегодняшней статье, но сначала поговорим какими они бывают:
for — позволяет перебрать все элементы из массива или использует переменную-счетчик для определения количества повторений;
while — цикл выполняется пока условие истинно;
until — цикл выполняется пока условие ложно.
Циклы Bash, это очень полезная вещь и разобраться с ними будет несложно. Bash позволяет использовать циклы как в скриптах, так и непосредственно в командной оболочке. Дальше мы рассмотрим каждый из этих видов циклов.
Цикл for
Цикл for bash применяется очень часто из-за своей специфики. Его проще всего использовать когда вы знаете сколько раз нужно повторить операцию или вам нужно просто обработать по очереди все элементы массива и вы не хотите контролировать количество повторений.
Цикл for имеет несколько синтаксисов и может вести себя по разному. Для перебора элементов списка удобно использовать такой синтаксис:
for переменная in список do команда1 команда2 done
Каждый цикл for независимо от типа начинается с ключевого слова for. Дальше все зависит от типа. В этом случае после for указывается имя переменной, в которую будет сохранен каждый элемент списка, затем идет ключевое слово in и сам список. Команды, которые нужно выполнять в цикле размещаются между словами do и done.
Проверим все на практике и напишем небольшой скрипт, который будет выводить номера от 1 до 5:
!/bin/bash for number in 1 2 3 4 5 do echo $number done
Дайте скрипту права на выполнение и запустите его:
chmod +x for1.sh ./for1.sh
Вы увидите, что все выполняется так, как и предполагалось. Программа выведет цифры от 1 до 5, которые мы перечислили в массиве. Вы можете передать циклу любой массив, например, вывод какой-либо другой команды:
for iface in $(ls /sys/class/net/) do echo $iface done
Как вы уже поняли, этот цикл выводит список всех, подключенных к системе сетевых интерфейсов. Но в цикле вы можете не только их выводить, но и выполнять какие-либо действия.
Следующий тип цикла for похож на его реализацию в языках программирования Си и С++. Он состоит из трех частей, инициализатора счетчика, условия продолжения выполнения и действия над счетчиком. Вот синтаксис:
for (( счетчик = 1 ; счетчик 10 ; счетчик ++ )) do команда1 команда2 done
Этот цикл немного сложнее, но он позволяет сделать больше. С помощью такого цикла можно не только перебирать массивы, но и сделать необходимое количество повторений. Рассмотрим пример:
!/bin/bash for ((i=1; i
Результат странный, правда? Обратите внимание, как выполняется проверка условия. Значение счетчика сравнивается с эталоном. Действие с переменной счетчиком выполняется сразу же после завершения основного блока команд, а уже потом делается сравнение. Таким образом, у нас при первом выполнении i равно 1, а после него уже два 2. Теперь к завершению девятого прохода значение счетчика будет увеличено на единицу и станет 10. Условие сравнения 10 !/bin/bash for ((;;)) do echo «Бесконечный цикл, нажмите CTRL+C для выхода» done
Если необходимо, вы можете выйти из цикла преждевременно. Но так делать не рекомендуется. Для выхода используйте команду break:
Со циклами for мы завершили, теперь вы знаете как они выглядят и что с ними делать. Дальше мы рассмотрим циклы while и until. Они намного проще и более универсальны.
Цикл While
Суть цикла While в том, что он будет повторяться до тех пор, пока будет выполняться условие, указанное в объявлении цикла. Здесь нет никаких счетчиков и если они вам нужны, то организовывать их вам придется самим. Bash цикл while имеет такой синтаксис:
while [ условие ] do команда1 команда2 команда3 done
Это работает так: сначала выполняется проверка на правильность условия, если true, выполняется набор команд, затем снова выполняется проверка, и так пока условие не вернет отрицательный результат. Это нам тоже нужно сделать вручную. Рассмотрим пример:
!/bin/bash x=1 while [ $x -lt 5 ] do echo «Значение счетчика: $x» x=$(( $x + 1 )) done
Здесь сначала мы устанавливаем значение счетчика в единицу, затем, в условии сравниваем его с 5, пока счетчик меньше пяти будут выполняться команды из блока do-done. Но еще в этом блоке нам нужно увеличивать значение счетчика на единицу, что мы и делаем.
Также с помощью while мы можем прочитать несколько строк из стандартного ввода:
!/bin/bash hile read line do echo $line done
Программа будет запрашивать новые строки пока вы не передадите ей символ конца файла с помощью сочетания клавиш Ctrl+D. Бесконечный цикл while bash с помощью while еще проще организовать:
while : do echo «Бесконечный цикл bash, для выхода нажмите Ctrl+C» done
Цикл until
Нам осталось рассмотреть последний цикл. Это цикл until. Он очень похож на while и отличается от него только работой условия. Если в первом нужно чтобы условие всегда было истинным, то здесь все наоборот. Цикл будет выполняться пока условие неверно. Синтаксис:
until [ условие ] do команда1 команда2 done
Думаю после рассмотрения реального примера со счетчиком будет намного понятнее как это работает:
!/bin/bash count=1 until [ $count -gt 10 ] do echo «Значение счетчика: $count» count=$(( $count + 1 )) done
Мы задаем значение счетчика 1 и увеличиваем его на единицу при каждом проходе. Как только условие счетчик больше 10 выполнится, сразу цикл будет остановлен. В циклах while и until тоже можно использовать команды break и continue для выхода из цикла и завершения текущего прохода, но мы не будем это очень подробно рассматривать.
Выводы
В этой статье мы рассмотрели циклы Bash, как с ними работать и в каких ситуациях их можно использовать. Циклы могут стать отличным и незаменимым инструментом при создании сложных скриптов администрирования системы. Если у вас остались вопросы, спрашивайте в комментариях!