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:
Каждая петля 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.
Выше – наглядный пример получившегося результата. Петле можно передавать любые массивы. Пример – вывод той или иной команды:
Соответствующий фрагмент с for I in do выведет список всех сетевых интерфейсов, которые были подключены к системе. Петли допускают не только вывод операций, но и их непосредственную реализацию.
Как в C++
For в Bash может быть реализован в нескольких формах. Первый рассмотренный вариант является элементарным и используется достаточно часто в большинстве скриптов. Второй вариант for – это СИ-подобная форма. Она напоминает реализацию петли в C и C++. Это непосредственный цикл со счетчиком. Он включает в себя несколько компонентов:
- инициализатор счетчика;
- условие для выполнения;
- непосредственные операции над счетчиком.
Синтаксическая форма представления такого for in do выглядит так:
Соответствующий вариант for является более сложным, но он позволяет выполнять более сложные операции. С его помощью удается не только перебирать массивы информации, но и выполнять строго определенное количество итераций. Лучше всего изучать процесс на наглядном примере.
Код и его пояснение
Вот так будет выглядеть фрагмент кода, который наглядно объяснит принцип работы for со счетчиком:
Результат может показаться странноватым, но здесь необходимо обратить внимание на выполнение проверки условия:
- Имеющееся значение сравнивает с эталоном.
- Действие с переменной счетчиком реализовывается сразу после завершения ключевого (основного) блока команд. Только после этого осуществляется сравнение.
- При первом выполнении i = 1, после обработки кода – 2ю
- К концу 10-го прохода i = 10. Условие не будет выполнено, так как результат сравнения не является истиной.
Текущая форма for in do echo позволяет самостоятельно создавать бесконечные циклы:
Выйти из бесконечного loop-компонента, а также из «обычного» for разрешено преждевременно. Для этого разработчик должен использовать команду break:
Применять break на практике не рекомендуется. Обычно данный оператор используется тогда, когда приложение ввиду тех или иных ошибок создало бесконечную петлю.
С постусловием
Циклы For в Bash уже изучены, но есть и другие варианты ветвлений. Они используются для более сложных операций. Второй вариант петли – это loop с постусловием.
Его суть отличается от for I in do. Такой цикл будет повторяться до тех пор, пока выполняется заданное в объявлении конструкции условие. Никаких счетчиков тут нет. Конструкция заменяет if в некоторых языках программирования.
Синтаксическая форма записи loop с while:
Работает конструкция так:
- Сначала выполняется проверка на правильность условия.
- Если результат – логическая истина, то произойдет обработка предложенных команд. После этого система снова проверит «правильность» условия.
- Приложение работает до тех пор, пока результат вычислений – true. Как только итогом станет логическая ложь (false), система передаст управление следующему после петли оператору.
Выше – наглядный пример с while. Сначала здесь устанавливается значение счетчика, равное 1. Далее в условии оно будет сравниваться с 5. Пока счетчик менее указанного «параметра», реализовываются команды, прописанные в блоке do-done then echo. В соответствующем блоке требуется на единицу с каждой итерацией увеличивать значение счетчика. Команда тоже реализовывается в полной мере.
Через while допускается считывание нескольких строк из стандартного ввода:
Приложение будет требовать новые строки до тех пор, пока не передается символ конца файла. Для этого используется сочетание клавиш Ctrl + D. Бесконечные петли через while организовать проще, чем посредством for:
Выше – наглядный пример соответствующей операции.
Циклы с until
Циклы for и while встречаются в разработке достаточно часто. Есть еще один вариант «петлей» – это фрагмент с предусловием. Он напоминает while. Отличается от «предшественника» только принципами работы заданного условия.
Чтобы написанные в скрипте команды выполнялись, результат расчетов написанного выражения должен быть ложным (fi false). Циклы until – полная противоположность while. Синтаксическая форма записи:
А вот наглядный пример со счетчиком:
Здесь сначала задается значение счетчика, равное 1. Каждая итерация увеличит соответствующий параметр на единицу. Как только значение счетчика оказывается больше 10, loop прекращает работу.
Для выхода из цикла в until и while допускается использование дополнительных команд. Они позволяют «досрочно» завершить работу с фрагментом кода и остановить программный код.
Принцип работы break
Оператор break может быть использован не только с циклами с пост- и предусловием, но и в for. Он отвечает за завершение текущей петли, после чего передает управление приложением команде, написанной после завершенной. Часто применяется для того, чтобы завершить цикл при выполнении конкретного условия.
Здесь программа прекращает работать, когда имя файла станет Lithium.
Использование continue
При работе с for sh и другими циклами может потребоваться реализация такого оператора как continue. Он работает подобно break. Отвечает за завершение текущей итерации, после чего передает управление программным обеспечением следующей итерации в пределах цикла.
Вот – наглядный пример перебора заданного числового диапазона. Оператор continue вернет выполнение к началу цикла тогда, когда текущий повторяемый компонент будет равен 2. После этого программа продолжит следующий проход через имеющийся фрагмент кода.
Как быстрее освоить тему
Циклы for в Bash – это не так сложно, как может показаться. Чтобы лучше изучить особенности применения петель в разработке, а также научить писать сложные приложения с нуля, рекомендуется обратить внимание на дистанционные онлайн-курсы. Они гарантируют:
- разнообразие направлений для обучения и возможность освоить любое IT-направление;
- совмещение с работой, семьей и другими делами – весь процесс организован через интернет;
- записи вебинаров и уроков – пропущенные занятие удастся посмотреть в любое время;
- сжатые сроки обучения – курсы рассчитаны на срок до 12 месяцев;
- постоянное кураторство опытными специалистами в выбранной области и помощь в формировании первого портфолио;
- интересные домашние задания и практические задачи.
При успешном завершении курса пользователю будет вручен электронный сертификат установленного образца. Он подтвердит приобретенные знания, навыки и умения.
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Циклы в Bash OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Bash является стандартной командной оболочкой, которая встречается у большинства дистрибутивов MacOS и Linux. Точно также называется язык для работы с соответствующим ПО. Его изучают преимущественно системные администраторы и те, кто хочет более профессионально владеть UNIX-подобными операционными системами. Язык Bash поддерживает переменные, условные и арифметические операторы, операции по вводу и выводу информации, массивы и разнообразные функции," />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/cikly-v-bash/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#article","name":"\u0426\u0438\u043a\u043b\u044b \u0432 Bash OTUS","headline":"\u0426\u0438\u043a\u043b\u044b \u0432 Bash","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2023\/06\/oj-1080x72066-1.jpg","width":2245,"height":1587},"datePublished":"2023-06-07T20:19:55+00:00","dateModified":"2024-01-18T19:11:15+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, Linux"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#listItem","position":2,"name":"\u0426\u0438\u043a\u043b\u044b \u0432 Bash","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#webpage","url":"https:\/\/otus.ru\/journal\/cikly-v-bash\/","name":"\u0426\u0438\u043a\u043b\u044b \u0432 Bash OTUS","description":"Bash \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u0432 MacOS \u0438 Linux. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u041f\u041e. \u0415\u0433\u043e \u0438\u0437\u0443\u0447\u0430\u044e\u0442 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u0438 \u0442\u0435, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0432\u043b\u0430\u0434\u0435\u0442\u044c UNIX-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438. \u042f\u0437\u044b\u043a Bash \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0435 \u0438 \u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u0432\u0432\u043e\u0434\u0443 \u0438 \u0432\u044b\u0432\u043e\u0434\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438,","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2023\/06\/oj-1080x72066-1.jpg","@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/cikly-v-bash\/#mainImage"},"datePublished":"2023-06-07T20:19:55+00:00","dateModified":"2024-01-18T19:11:15+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/6720" /><link rel='shortlink' href='https://otus.ru/journal/?p=6720' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fcikly-v-bash%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fcikly-v-bash%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-6720 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-6720" class="the-post post-6720 post type-post status-publish format-standard has-post-thumbnail category-polza tag-linux">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Циклы в Bash
</h1>
<a href="https://otus.ru/journal/cikly-v-bash/" class="date-link" data-wpel-link="internal"><time class="post-date">7 июня, 2023</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72066-1.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Циклы в Bash" title="Циклы в Bash" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72066-1-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72066-1-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72066-1-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F" title="Основная терминология">Основная терминология</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%A6%D0%B8%D0%BA%D0%BB_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6" title="Цикл – это…">Цикл – это…</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F" title="Классификация">Классификация</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%A6%D0%B8%D0%BA%D0%BB%D1%8B_for" title="Циклы for">Циклы for</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80" title="Наглядный пример">Наглядный пример</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9A%D0%B0%D0%BA_%D0%B2_C" title="Как в C++">Как в C++</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%9A%D0%BE%D0%B4_%D0%B8_%D0%B5%D0%B3%D0%BE_%D0%BF%D0%BE%D1%8F%D1%81%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5" title="Код и его пояснение">Код и его пояснение</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%A1_%D0%BF%D0%BE%D1%81%D1%82%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%D0%BC" title="С постусловием">С постусловием</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%A6%D0%B8%D0%BA%D0%BB%D1%8B_%D1%81_until" title="Циклы с until">Циклы с until</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_break" title="Принцип работы break">Принцип работы break</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_continue" title="Использование continue">Использование continue</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%9A%D0%B0%D0%BA_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%B5%D0%B5_%D0%BE%D1%81%D0%B2%D0%BE%D0%B8%D1%82%D1%8C_%D1%82%D0%B5%D0%BC%D1%83" title="Как быстрее освоить тему">Как быстрее освоить тему</a></li></ul></nav></div>
<p>Bash является стандартной командной оболочкой, которая встречается у большинства дистрибутивов MacOS и Linux. Точно также называется язык для работы с соответствующим ПО. Его изучают преимущественно системные администраторы и те, кто хочет более профессионально владеть UNIX-подобными операционными системами.</p>
<p>Язык Bash поддерживает переменные, условные и арифметические операторы, операции по вводу и выводу информации, массивы и разнообразные функции, а также циклы. С его помощью удается создавать <a href="https://otus.ru/journal/osnovy-raboty-so-skriptami/" data-wpel-link="internal">скрипты</a>, которые помогают ускорять работу программного обеспечения. Дополнительно они служат средствами автоматизации некоторых рутинных процессов.</p>
<p>Сегодня предстоит познакомиться не со всеми инструментами Bash-Scripts, а только с циклами. С их помощью удается выполнять различные задачи, а также обеспечивать автоматизацию некоторых операций и выбор желаемого алгоритма в зависимости от ситуации. Информация рассчитана на тех, кто уже хоть немного знаком с принципами разработки.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F_%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F"></span>Основная терминология<span class="ez-toc-section-end"></span></h2>
<p>Перед тем как работать с различными циклами, программисту потребуется запомнить несколько ключевых определений. Они пригодятся не только в Bash скриптах, но и в иных языках программирования:</p>
<ol>
<li>Алгоритм – набор некоторых инструкций и правил, необходимых для решения поставленной перед разработчиком задачи.</li>
<li>Аргумент – значение, передаваемой в команду или функцию.</li>
<li>Символ – простейшая единица отображения данных в программе или запросе. Равняется одной буквенной или символьной записи.</li>
<li>Интерфейс командной строки – пользовательский интерфейс, базирующийся на основе текста. Он используется для управления документами и их просмотра.</li>
<li>Константы – значение, которое не меняется во время выполнения различных операций в скриптах (исходном коде).</li>
<li>Массив – множество значений. Списки или группы схожих типов значений данных, которые были предварительно сгруппированы.</li>
<li>Переменная – место хранения информации в программе.</li>
<li>Оператор – объект, который умеет через специальные команды умеет манипулировать операндами.</li>
<li>Операнд – объекты, которыми можно манипулировать через операторы языка.</li>
</ol>
<p>Все предложенные определения и понятия помогут лучше работать и считывать исходные коды приложений. Отдельное внимание предстоит уделить терминологии, тесно связанной с циклами. Без них выполнять большинство операций не получится.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A6%D0%B8%D0%BA%D0%BB_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6"></span>Цикл – это…<span class="ez-toc-section-end"></span></h2>
<p>Перед тем как работать с циклами, необходимо понять, что собой представляет соответствующий компонент. Он иногда называется «петля» или «ветвление». Цикл – это последовательность инструкций, которые будут повторять один и тот же процесс раз за разом. Происходит это до тех пор, пока приложение не получает команду на остановку или не выполняет прописанное в скрипте условие. В циклах программное обеспечение «задает вопрос» и, если ответ указывает на выполнение операции, действие реализовывается. После этого «петля» запускается снова, обрабатывая аналогичную задачу.</p>
<p>В Bash петля может использоваться для автоматизации некоторых распространенных процессов и команд. Рекомендуется запомнить еще несколько понятий, связанных с «ветвлением»:</p>
<ol>
<li>Бесконечный цикл (бесконечная петля). Так описывается непрерывное повторение блока кода приложения. Оно будет функционировать вечно, на постоянной основе. Обычно соответствующая ситуация возникает из-за условных операторов, а также функций. Они перенаправляют код обратно в используемый фрагмент, реализовывая его снова и снова. Часто становится следствием неправильно реализованной логики в скрипте.</li>
<li>Итерация – один проход через набор операций, работающих с исходным кодом. Наиболее распространенным вариантом работы с итерациями является внедрение в скрипт.</li>
<li>Указатель – переменная, которая включает в себя адрес места в памяти.</li>
</ol>
<p>Теперь можно приступать к более детальному изучению петель в Bash на наглядных примерах. Изучать соответствующее направление намного проще будет тем, кто уже знаком с ветвлениями в других языках разработки.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F"></span>Классификация<span class="ez-toc-section-end"></span></h3>
<p>Петли у большинства языков разработки могут быть разными. В зависимости от типа loop будет меняться принцип работы рассматриваемого компонента и особенности реализации различных задач. Bash не является исключением.</p>
<p>Существуют различные варианты «петель»:</p>
<ul>
<li>цикл for (in do) – со счетчиком;</li>
<li>цикл while – с постусловием;</li>
<li>цикл until – с предусловием.</li>
</ul>
<p>Bash допускает использование loops как в скриптах, так и непосредственно в командной оболочке. Далее каждый вариант петли будет изучен более подробно.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A6%D0%B8%D0%BA%D0%BB%D1%8B_for"></span>Циклы for<span class="ez-toc-section-end"></span></h2>
<p>For in do – самый простой вариант петли. Он у большинства языков программирования называется циклом со счетчиком. Особо полезен тогда, когда программист точно знает количество итераций (сколько раз нужно повторить фрагмент) алгоритма. For позволяет просто обрабатывать по очереди все элементы в пределах массива без контроля количества повторений.</p>
<p>For предусматривает несколько синтаксических форм и умеет вести себя различными способами. Все зависит от первоначально поставленной перед разработчиком цели. Для того, чтобы перебирать компоненты в списке, рекомендуется пользоваться следующей формой for in do:</p>
<figure class="wp-block-image size-full"><img decoding="async" width="304" height="131" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-173.png" alt="Циклы в Bash" class="wp-image-6722" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-173.png 304w, https://otus.ru/journal/wp-content/uploads/2023/06/image-173-300x129.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-173-150x65.png 150w" sizes="(max-width: 304px) 100vw, 304px" /></figure>
<p>Каждая петля for, независимо от типа, начинается с ключевого слова for. Далее ситуация зависит от того, какой именно вариант рассматриваемого элемента применяется. В предложенном после for указывается имя переменной, в которой сохраняется каждый компонент списка. Далее указывается ключевое слово in и список. Спектр команд на выполнение размещаются между do и done.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80"></span>Наглядный пример<span class="ez-toc-section-end"></span></h3>
<p>Чтобы лучше понять, как выполняется for in do, рекомендуется рассмотреть процесс на наглядном примере. Предстоит написать скрипт, который будет выводить номера от 1 до 5:</p>
<ol>
<li>Сначала формируется команда: $ vi for1.sh.</li>
<li>Далее пишется фрагмент: #!/bin/bash<br>for number in 1 2 3 4 5<br>do<br>echo $number<br>done.</li>
<li>Скрипт запускается: $ chmod +x for1.sh<br>./for1.sh.</li>
</ol>
<figure class="wp-block-image size-full"><img decoding="async" width="491" height="317" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-174.png" alt="Циклы в Bash" class="wp-image-6723" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-174.png 491w, https://otus.ru/journal/wp-content/uploads/2023/06/image-174-300x194.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-174-150x97.png 150w" sizes="(max-width: 491px) 100vw, 491px" /></figure>
<p>Выше – наглядный пример получившегося результата. Петле можно передавать любые массивы. Пример – вывод той или иной команды:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="244" height="45" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-175.png" alt="Циклы в Bash" class="wp-image-6724" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-175.png 244w, https://otus.ru/journal/wp-content/uploads/2023/06/image-175-150x28.png 150w" sizes="(max-width: 244px) 100vw, 244px" /></figure>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="309" height="115" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-172.png" alt="Циклы в Bash" class="wp-image-6721" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-172.png 309w, https://otus.ru/journal/wp-content/uploads/2023/06/image-172-300x112.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-172-150x56.png 150w, https://otus.ru/journal/wp-content/uploads/2023/06/image-172-306x115.png 306w" sizes="(max-width: 309px) 100vw, 309px" /></figure>
<p>Соответствующий фрагмент с for I in do выведет список всех сетевых интерфейсов, которые были подключены к системе. Петли допускают не только вывод операций, но и их непосредственную реализацию.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D0%B2_C"></span>Как в C++<span class="ez-toc-section-end"></span></h2>
<p>For в Bash может быть реализован в нескольких формах. Первый рассмотренный вариант является элементарным и используется достаточно часто в большинстве скриптов. Второй вариант for – это СИ-подобная форма. Она напоминает реализацию петли в C и C++. Это непосредственный цикл со счетчиком. Он включает в себя несколько компонентов:</p>
<ul>
<li>инициализатор счетчика;</li>
<li>условие для выполнения;</li>
<li>непосредственные операции над счетчиком.</li>
</ul>
<p>Синтаксическая форма представления такого for in do выглядит так:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="465" height="140" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-179.png" alt="Циклы в Bash" class="wp-image-6728" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-179.png 465w, https://otus.ru/journal/wp-content/uploads/2023/06/image-179-300x90.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-179-150x45.png 150w" sizes="(max-width: 465px) 100vw, 465px" /></figure>
<p>Соответствующий вариант for является более сложным, но он позволяет выполнять более сложные операции. С его помощью удается не только перебирать массивы информации, но и выполнять строго определенное количество итераций. Лучше всего изучать процесс на наглядном примере.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%B4_%D0%B8_%D0%B5%D0%B3%D0%BE_%D0%BF%D0%BE%D1%8F%D1%81%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5"></span>Код и его пояснение<span class="ez-toc-section-end"></span></h3>
<p>Вот так будет выглядеть фрагмент кода, который наглядно объяснит принцип работы for со счетчиком:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="229" height="137" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-177.png" alt="Циклы в Bash" class="wp-image-6726" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-177.png 229w, https://otus.ru/journal/wp-content/uploads/2023/06/image-177-150x90.png 150w" sizes="(max-width: 229px) 100vw, 229px" /></figure>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="480" height="153" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-178.png" alt="Циклы в Bash" class="wp-image-6727" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-178.png 480w, https://otus.ru/journal/wp-content/uploads/2023/06/image-178-300x96.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-178-150x48.png 150w" sizes="(max-width: 480px) 100vw, 480px" /></figure>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="491" height="236" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-176.png" alt="Циклы в Bash" class="wp-image-6725" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-176.png 491w, https://otus.ru/journal/wp-content/uploads/2023/06/image-176-300x144.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-176-150x72.png 150w" sizes="(max-width: 491px) 100vw, 491px" /></figure>
<p>Результат может показаться странноватым, но здесь необходимо обратить внимание на выполнение проверки условия:</p>
<ol>
<li>Имеющееся значение сравнивает с эталоном.</li>
<li>Действие с переменной счетчиком реализовывается сразу после завершения ключевого (основного) блока команд. Только после этого осуществляется сравнение.</li>
<li>При первом выполнении i = 1, после обработки кода – 2ю</li>
<li>К концу 10-го прохода i = 10. Условие не будет выполнено, так как результат сравнения не является истиной.</li>
</ol>
<p>Текущая форма for in do echo позволяет самостоятельно создавать бесконечные циклы:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="493" height="141" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-181.png" alt="Циклы в Bash" class="wp-image-6730" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-181.png 493w, https://otus.ru/journal/wp-content/uploads/2023/06/image-181-300x86.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-181-150x43.png 150w" sizes="(max-width: 493px) 100vw, 493px" /></figure>
<p>Выйти из бесконечного loop-компонента, а также из «обычного» for разрешено преждевременно. Для этого разработчик должен использовать команду break:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="275" height="205" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-182.png" alt="Циклы в Bash" class="wp-image-6732" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-182.png 275w, https://otus.ru/journal/wp-content/uploads/2023/06/image-182-150x112.png 150w" sizes="(max-width: 275px) 100vw, 275px" /></figure>
<p>Применять break на практике не рекомендуется. Обычно данный оператор используется тогда, когда приложение ввиду тех или иных ошибок создало бесконечную петлю.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1_%D0%BF%D0%BE%D1%81%D1%82%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B5%D0%BC"></span>С постусловием<span class="ez-toc-section-end"></span></h2>
<p>Циклы For в Bash уже изучены, но есть и другие варианты ветвлений. Они используются для более сложных операций. Второй вариант петли – это loop с постусловием.</p>
<p>Его суть отличается от for I in do. Такой цикл будет повторяться до тех пор, пока выполняется заданное в объявлении конструкции условие. Никаких счетчиков тут нет. Конструкция заменяет if в некоторых языках программирования.</p>
<p>Синтаксическая форма записи loop с while:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="210" height="157" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-185.png" alt="Циклы в Bash" class="wp-image-6734" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-185.png 210w, https://otus.ru/journal/wp-content/uploads/2023/06/image-185-150x112.png 150w" sizes="(max-width: 210px) 100vw, 210px" /></figure>
<p>Работает конструкция так:</p>
<ol>
<li>Сначала выполняется проверка на правильность условия.</li>
<li>Если результат – логическая истина, то произойдет обработка предложенных команд. После этого система снова проверит «правильность» условия.</li>
<li>Приложение работает до тех пор, пока результат вычислений – true. Как только итогом станет логическая ложь (false), система передаст управление следующему после петли оператору.</li>
</ol>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="305" height="266" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-187.png" alt="Циклы в Bash" class="wp-image-6736" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-187.png 305w, https://otus.ru/journal/wp-content/uploads/2023/06/image-187-300x262.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-187-150x131.png 150w" sizes="(max-width: 305px) 100vw, 305px" /></figure>
<p>Выше – наглядный пример с while. Сначала здесь устанавливается значение счетчика, равное 1. Далее в условии оно будет сравниваться с 5. Пока счетчик менее указанного «параметра», реализовываются команды, прописанные в блоке do-done then echo. В соответствующем блоке требуется на единицу с каждой итерацией увеличивать значение счетчика. Команда тоже реализовывается в полной мере.</p>
<p>Через while допускается считывание нескольких строк из стандартного ввода:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="220" height="223" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-189.png" alt="Циклы в Bash" class="wp-image-6738" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-189.png 220w, https://otus.ru/journal/wp-content/uploads/2023/06/image-189-148x150.png 148w" sizes="(max-width: 220px) 100vw, 220px" /></figure>
<p>Приложение будет требовать новые строки до тех пор, пока не передается символ конца файла. Для этого используется сочетание клавиш Ctrl + D. Бесконечные петли через while организовать проще, чем посредством for:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="504" height="195" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-190.png" alt="Циклы в Bash" class="wp-image-6739" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-190.png 504w, https://otus.ru/journal/wp-content/uploads/2023/06/image-190-300x116.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-190-150x58.png 150w" sizes="(max-width: 504px) 100vw, 504px" /></figure>
<p>Выше – наглядный пример соответствующей операции.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A6%D0%B8%D0%BA%D0%BB%D1%8B_%D1%81_until"></span>Циклы с until<span class="ez-toc-section-end"></span></h3>
<p>Циклы for и while встречаются в разработке достаточно часто. Есть еще один вариант «петлей» – это фрагмент с предусловием. Он напоминает while. Отличается от «предшественника» только принципами работы заданного условия.</p>
<p>Чтобы написанные в скрипте команды выполнялись, результат расчетов написанного выражения должен быть ложным (fi false). Циклы until – полная противоположность while. Синтаксическая форма записи:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="176" height="130" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-188.png" alt="Циклы в Bash" class="wp-image-6737" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-188.png 176w, https://otus.ru/journal/wp-content/uploads/2023/06/image-188-150x111.png 150w" sizes="(max-width: 176px) 100vw, 176px" /></figure>
<p>А вот наглядный пример со счетчиком:</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="295" height="191" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-186.png" alt="Циклы в Bash" class="wp-image-6735" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-186.png 295w, https://otus.ru/journal/wp-content/uploads/2023/06/image-186-150x97.png 150w" sizes="(max-width: 295px) 100vw, 295px" /></figure>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="477" height="235" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-184.png" alt="Циклы в Bash" class="wp-image-6733" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-184.png 477w, https://otus.ru/journal/wp-content/uploads/2023/06/image-184-300x148.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-184-150x74.png 150w" sizes="(max-width: 477px) 100vw, 477px" /></figure>
<p>Здесь сначала задается значение счетчика, равное 1. Каждая итерация увеличит соответствующий параметр на единицу. Как только значение счетчика оказывается больше 10, loop прекращает работу.</p>
<p>Для выхода из цикла в until и while допускается использование дополнительных команд. Они позволяют «досрочно» завершить работу с фрагментом кода и остановить программный код.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_break"></span>Принцип работы break<span class="ez-toc-section-end"></span></h2>
<p>Оператор break может быть использован не только с циклами с пост- и предусловием, но и в for. Он отвечает за завершение текущей петли, после чего передает управление приложением команде, написанной после завершенной. Часто применяется для того, чтобы завершить цикл при выполнении конкретного условия.</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="457" height="182" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-183.png" alt="Циклы в Bash" class="wp-image-6731" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-183.png 457w, https://otus.ru/journal/wp-content/uploads/2023/06/image-183-300x119.png 300w, https://otus.ru/journal/wp-content/uploads/2023/06/image-183-150x60.png 150w" sizes="(max-width: 457px) 100vw, 457px" /></figure>
<p>Здесь программа прекращает работать, когда имя файла станет Lithium.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_continue"></span>Использование continue<span class="ez-toc-section-end"></span></h2>
<p>При работе с for sh и другими циклами может потребоваться реализация такого оператора как continue. Он работает подобно break. Отвечает за завершение текущей итерации, после чего передает управление программным обеспечением следующей итерации в пределах цикла.</p>
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="299" height="148" src="https://otus.ru/journal/wp-content/uploads/2023/06/image-180.png" alt="Циклы в Bash" class="wp-image-6729" srcset="https://otus.ru/journal/wp-content/uploads/2023/06/image-180.png 299w, https://otus.ru/journal/wp-content/uploads/2023/06/image-180-150x74.png 150w" sizes="(max-width: 299px) 100vw, 299px" /></figure>
<p>Вот – наглядный пример перебора заданного числового диапазона. Оператор continue вернет выполнение к началу цикла тогда, когда текущий повторяемый компонент будет равен 2. После этого программа продолжит следующий проход через имеющийся фрагмент кода.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%B5%D0%B5_%D0%BE%D1%81%D0%B2%D0%BE%D0%B8%D1%82%D1%8C_%D1%82%D0%B5%D0%BC%D1%83"></span>Как быстрее освоить тему<span class="ez-toc-section-end"></span></h2>
<p>Циклы for в Bash – это не так сложно, как может показаться. Чтобы лучше изучить особенности применения петель в разработке, а также научить писать сложные <a href="https://otus.ru/journal/sozdanie-pervogo-prilozheniya-na-c/" data-wpel-link="internal">приложения с</a> нуля, рекомендуется обратить внимание на дистанционные онлайн-курсы. Они гарантируют:</p>
<ul>
<li>разнообразие направлений для обучения и возможность освоить любое IT-направление;</li>
<li>совмещение с работой, семьей и другими делами – весь процесс организован через интернет;</li>
<li>записи вебинаров и уроков – пропущенные занятие удастся посмотреть в любое время;</li>
<li>сжатые сроки обучения – курсы рассчитаны на срок до 12 месяцев;</li>
<li>постоянное кураторство опытными специалистами в выбранной области и помощь в формировании первого портфолио;</li>
<li>интересные домашние задания и практические задачи.</li>
</ul>
<p><a href="https://otus.ru/lessons/linux-professional/?utm_source=oj&utm_medium=affilate&utm_campaign=linux" title="" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">При успешном завершении курса<span class="wpel-icon wpel-image wpel-icon-6"></span></a> пользователю будет вручен электронный сертификат установленного образца. Он подтвердит приобретенные знания, навыки и умения.</p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/linux/" rel="tag" data-wpel-link="internal">Linux</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fcikly-v-bash%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fcikly-v-bash%2F&text=%D0%A6%D0%B8%D0%BA%D0%BB%D1%8B%20%D0%B2%20Bash" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fcikly-v-bash%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fcikly-v-bash%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2023%2F06%2Foj-1080x72066-1.jpg&description=%D0%A6%D0%B8%D0%BA%D0%BB%D1%8B%20%D0%B2%20Bash" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/kak-otkryt-fajl-operacionnaya-sistema-i-razrabotka/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/kak-otkryt-fajl-operacionnaya-sistema-i-razrabotka/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Как открыть файл: операционная система и разработка" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72065-1-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72065-1-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72065-1-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72065-1-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72065-1-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72065-1-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Как открыть файл: операционная система и разработка" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/kak-otkryt-fajl-operacionnaya-sistema-i-razrabotka/" data-wpel-link="internal">Как открыть файл: операционная система и разработка</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/kak-otkryt-fajl-operacionnaya-sistema-i-razrabotka/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-06-07T20:12:13+00:00">7 июня, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">4 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/preobrazovanie-strok-v-c/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/preobrazovanie-strok-v-c/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Преобразование строк в C#" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72067-1-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72067-1-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72067-1-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72067-1-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72067-1-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2023/06/oj-1080x72067-1-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Преобразование строк в C#" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/preobrazovanie-strok-v-c/" data-wpel-link="internal">Преобразование строк в C#</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/preobrazovanie-strok-v-c/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2023-06-07T20:27:19+00:00">7 июня, 2023</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">6 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/cikly-v-bash\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Mon, 09 Mar 2026 15:36:04 GMT -->