Bash является стандартной командной оболочкой, которая встречается у большинства дистрибутивов MacOS и Linux. Точно также называется язык для работы с соответствующим ПО. Его изучают преимущественно системные администраторы и те, кто хочет более профессионально владеть UNIX-подобными операционными системами.
Язык Bash поддерживает переменные, условные и арифметические операторы, операции по вводу и выводу информации, массивы и разнообразные функции, а также циклы. С его помощью удается создавать скрипты, которые помогают ускорять работу программного обеспечения. Дополнительно они служат средствами автоматизации некоторых рутинных процессов.
Сегодня предстоит познакомиться не со всеми инструментами Bash-Scripts, а только с циклами. С их помощью удается выполнять различные задачи, а также обеспечивать автоматизацию некоторых операций и выбор желаемого алгоритма в зависимости от ситуации. Информация рассчитана на тех, кто уже хоть немного знаком с принципами разработки.
Основная терминология
Перед тем как работать с различными циклами, программисту потребуется запомнить несколько ключевых определений. Они пригодятся не только в Bash скриптах, но и в иных языках программирования:
- Алгоритм – набор некоторых инструкций и правил, необходимых для решения поставленной перед разработчиком задачи.
- Аргумент – значение, передаваемой в команду или функцию.
- Символ – простейшая единица отображения данных в программе или запросе. Равняется одной буквенной или символьной записи.
- Интерфейс командной строки – пользовательский интерфейс, базирующийся на основе текста. Он используется для управления документами и их просмотра.
- Константы – значение, которое не меняется во время выполнения различных операций в скриптах (исходном коде).
- Массив – множество значений. Списки или группы схожих типов значений данных, которые были предварительно сгруппированы.
- Переменная – место хранения информации в программе.
- Оператор – объект, который умеет через специальные команды умеет манипулировать операндами.
- Операнд – объекты, которыми можно манипулировать через операторы языка.
Все предложенные определения и понятия помогут лучше работать и считывать исходные коды приложений. Отдельное внимание предстоит уделить терминологии, тесно связанной с циклами. Без них выполнять большинство операций не получится.
Цикл – это…
Перед тем как работать с циклами, необходимо понять, что собой представляет соответствующий компонент. Он иногда называется «петля» или «ветвление». Цикл – это последовательность инструкций, которые будут повторять один и тот же процесс раз за разом. Происходит это до тех пор, пока приложение не получает команду на остановку или не выполняет прописанное в скрипте условие. В циклах программное обеспечение «задает вопрос» и, если ответ указывает на выполнение операции, действие реализовывается. После этого «петля» запускается снова, обрабатывая аналогичную задачу.
В Bash петля может использоваться для автоматизации некоторых распространенных процессов и команд. Рекомендуется запомнить еще несколько понятий, связанных с «ветвлением»:
- Бесконечный цикл (бесконечная петля). Так описывается непрерывное повторение блока кода приложения. Оно будет функционировать вечно, на постоянной основе. Обычно соответствующая ситуация возникает из-за условных операторов, а также функций. Они перенаправляют код обратно в используемый фрагмент, реализовывая его снова и снова. Часто становится следствием неправильно реализованной логики в скрипте.
- Итерация – один проход через набор операций, работающих с исходным кодом. Наиболее распространенным вариантом работы с итерациями является внедрение в скрипт.
- Указатель – переменная, которая включает в себя адрес места в памяти.
Теперь можно приступать к более детальному изучению петель в Bash на наглядных примерах. Изучать соответствующее направление намного проще будет тем, кто уже знаком с ветвлениями в других языках разработки.
Классификация
Петли у большинства языков разработки могут быть разными. В зависимости от типа loop будет меняться принцип работы рассматриваемого компонента и особенности реализации различных задач. Bash не является исключением.
Существуют различные варианты «петель»:
- цикл for (in do) – со счетчиком;
- цикл while – с постусловием;
- цикл until – с предусловием.
Bash допускает использование loops как в скриптах, так и непосредственно в командной оболочке. Далее каждый вариант петли будет изучен более подробно.
Циклы for
For in do – самый простой вариант петли. Он у большинства языков программирования называется циклом со счетчиком. Особо полезен тогда, когда программист точно знает количество итераций (сколько раз нужно повторить фрагмент) алгоритма. For позволяет просто обрабатывать по очереди все элементы в пределах массива без контроля количества повторений.
For предусматривает несколько синтаксических форм и умеет вести себя различными способами. Все зависит от первоначально поставленной перед разработчиком цели. Для того, чтобы перебирать компоненты в списке, рекомендуется пользоваться следующей формой for in do:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-173.png)
Каждая петля for, независимо от типа, начинается с ключевого слова for. Далее ситуация зависит от того, какой именно вариант рассматриваемого элемента применяется. В предложенном после for указывается имя переменной, в которой сохраняется каждый компонент списка. Далее указывается ключевое слово in и список. Спектр команд на выполнение размещаются между do и done.
Наглядный пример
Чтобы лучше понять, как выполняется for in do, рекомендуется рассмотреть процесс на наглядном примере. Предстоит написать скрипт, который будет выводить номера от 1 до 5:
- Сначала формируется команда: $ vi for1.sh.
- Далее пишется фрагмент: #!/bin/bash
for number in 1 2 3 4 5
do
echo $number
done. - Скрипт запускается: $ chmod +x for1.sh
./for1.sh.
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-174.png)
Выше – наглядный пример получившегося результата. Петле можно передавать любые массивы. Пример – вывод той или иной команды:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-175.png)
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-172.png)
Соответствующий фрагмент с for I in do выведет список всех сетевых интерфейсов, которые были подключены к системе. Петли допускают не только вывод операций, но и их непосредственную реализацию.
Как в C++
For в Bash может быть реализован в нескольких формах. Первый рассмотренный вариант является элементарным и используется достаточно часто в большинстве скриптов. Второй вариант for – это СИ-подобная форма. Она напоминает реализацию петли в C и C++. Это непосредственный цикл со счетчиком. Он включает в себя несколько компонентов:
- инициализатор счетчика;
- условие для выполнения;
- непосредственные операции над счетчиком.
Синтаксическая форма представления такого for in do выглядит так:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-179.png)
Соответствующий вариант for является более сложным, но он позволяет выполнять более сложные операции. С его помощью удается не только перебирать массивы информации, но и выполнять строго определенное количество итераций. Лучше всего изучать процесс на наглядном примере.
Код и его пояснение
Вот так будет выглядеть фрагмент кода, который наглядно объяснит принцип работы for со счетчиком:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-177.png)
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-178.png)
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-176.png)
Результат может показаться странноватым, но здесь необходимо обратить внимание на выполнение проверки условия:
- Имеющееся значение сравнивает с эталоном.
- Действие с переменной счетчиком реализовывается сразу после завершения ключевого (основного) блока команд. Только после этого осуществляется сравнение.
- При первом выполнении i = 1, после обработки кода – 2ю
- К концу 10-го прохода i = 10. Условие не будет выполнено, так как результат сравнения не является истиной.
Текущая форма for in do echo позволяет самостоятельно создавать бесконечные циклы:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-181.png)
Выйти из бесконечного loop-компонента, а также из «обычного» for разрешено преждевременно. Для этого разработчик должен использовать команду break:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-182.png)
Применять break на практике не рекомендуется. Обычно данный оператор используется тогда, когда приложение ввиду тех или иных ошибок создало бесконечную петлю.
С постусловием
Циклы For в Bash уже изучены, но есть и другие варианты ветвлений. Они используются для более сложных операций. Второй вариант петли – это loop с постусловием.
Его суть отличается от for I in do. Такой цикл будет повторяться до тех пор, пока выполняется заданное в объявлении конструкции условие. Никаких счетчиков тут нет. Конструкция заменяет if в некоторых языках программирования.
Синтаксическая форма записи loop с while:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-185.png)
Работает конструкция так:
- Сначала выполняется проверка на правильность условия.
- Если результат – логическая истина, то произойдет обработка предложенных команд. После этого система снова проверит «правильность» условия.
- Приложение работает до тех пор, пока результат вычислений – true. Как только итогом станет логическая ложь (false), система передаст управление следующему после петли оператору.
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-187.png)
Выше – наглядный пример с while. Сначала здесь устанавливается значение счетчика, равное 1. Далее в условии оно будет сравниваться с 5. Пока счетчик менее указанного «параметра», реализовываются команды, прописанные в блоке do-done then echo. В соответствующем блоке требуется на единицу с каждой итерацией увеличивать значение счетчика. Команда тоже реализовывается в полной мере.
Через while допускается считывание нескольких строк из стандартного ввода:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-189.png)
Приложение будет требовать новые строки до тех пор, пока не передается символ конца файла. Для этого используется сочетание клавиш Ctrl + D. Бесконечные петли через while организовать проще, чем посредством for:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-190.png)
Выше – наглядный пример соответствующей операции.
Циклы с until
Циклы for и while встречаются в разработке достаточно часто. Есть еще один вариант «петлей» – это фрагмент с предусловием. Он напоминает while. Отличается от «предшественника» только принципами работы заданного условия.
Чтобы написанные в скрипте команды выполнялись, результат расчетов написанного выражения должен быть ложным (fi false). Циклы until – полная противоположность while. Синтаксическая форма записи:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-188.png)
А вот наглядный пример со счетчиком:
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-186.png)
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-184.png)
Здесь сначала задается значение счетчика, равное 1. Каждая итерация увеличит соответствующий параметр на единицу. Как только значение счетчика оказывается больше 10, loop прекращает работу.
Для выхода из цикла в until и while допускается использование дополнительных команд. Они позволяют «досрочно» завершить работу с фрагментом кода и остановить программный код.
Принцип работы break
Оператор break может быть использован не только с циклами с пост- и предусловием, но и в for. Он отвечает за завершение текущей петли, после чего передает управление приложением команде, написанной после завершенной. Часто применяется для того, чтобы завершить цикл при выполнении конкретного условия.
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-183.png)
Здесь программа прекращает работать, когда имя файла станет Lithium.
Использование continue
При работе с for sh и другими циклами может потребоваться реализация такого оператора как continue. Он работает подобно break. Отвечает за завершение текущей итерации, после чего передает управление программным обеспечением следующей итерации в пределах цикла.
![Циклы в Bash](https://otus.ru/journal/wp-content/uploads/2023/06/image-180.png)
Вот – наглядный пример перебора заданного числового диапазона. Оператор continue вернет выполнение к началу цикла тогда, когда текущий повторяемый компонент будет равен 2. После этого программа продолжит следующий проход через имеющийся фрагмент кода.
Как быстрее освоить тему
Циклы for в Bash – это не так сложно, как может показаться. Чтобы лучше изучить особенности применения петель в разработке, а также научить писать сложные приложения с нуля, рекомендуется обратить внимание на дистанционные онлайн-курсы. Они гарантируют:
- разнообразие направлений для обучения и возможность освоить любое IT-направление;
- совмещение с работой, семьей и другими делами – весь процесс организован через интернет;
- записи вебинаров и уроков – пропущенные занятие удастся посмотреть в любое время;
- сжатые сроки обучения – курсы рассчитаны на срок до 12 месяцев;
- постоянное кураторство опытными специалистами в выбранной области и помощь в формировании первого портфолио;
- интересные домашние задания и практические задачи.
При успешном завершении курса пользователю будет вручен электронный сертификат установленного образца. Он подтвердит приобретенные знания, навыки и умения.