Цель урока: Научить наши скрипты выполнять однотипные действия многократно без нашего участия. Мы изучим два основных типа циклов: for
(для перебора элементов в списке) и while
(для выполнения команд, пока истинно некое условие). Это ключ к автоматизации таких задач, как обработка множества файлов, создание резервных копий или мониторинг состояния системы.
Часть 1: Теория. Зачем нужны циклы?
Представьте, что вам нужно переименовать 100 файлов, добавив к каждому расширение .bak. Вы можете 100 раз вручную ввести команду mv, но это долго, утомительно и можно легко ошибиться.
Цикл - это конструкция в программировании, которая позволяет выполнить один и тот же блок кода несколько раз подряд. Вы пишете код для обработки одного файла, "оборачиваете" его в цикл, и система сама применяет его ко всем 100 файлам.
В Bash есть два главных вида циклов для разных сценариев:
-
Цикл for: Идеален, когда у вас есть конкретный, конечный список элементов, и вам нужно что-то сделать с каждым из них.
-
Аналогия: Рабочий на конвейере, перед которым лежит ящик с 20 деталями. Он берет первую деталь, обрабатывает ее, откладывает. Берет вторую, обрабатывает, откладывает. И так до тех пор, пока детали в ящике не закончатся.
-
Примеры задач: переименовать все файлы в папке, проверить статус каждого сайта из списка, скопировать несколько каталогов.
-
-
Цикл while: Идеален, когда вы не знаете точное количество повторений, но знаете условие, при котором нужно остановиться.
-
Аналогия: Охранник, который должен обходить территорию, пока не наступит 6 утра. Он не знает, сколько кругов он сделает (может 50, может 51), но он знает условие прекращения работы.
-
Примеры задач: ждать, пока не освободится место на диске; проверять доступность сервера каждые 5 минут, пока он не ответит; читать файл строка за строкой до его конца.
-
Часть 2: Практика. Цикл for - перебор элементов списка
Синтаксис:
for ПЕРЕМЕННАЯ in СПИСОК_ЭЛЕМЕНТОВ
do
# Блок команд, который будет выполняться
# для каждого элемента из списка.
# Внутри блока мы можем использовать $ПЕРЕМЕННАЯ
done
-
for, in, do, done - это ключевые слова, они всегда такие.
-
ПЕРЕМЕННАЯ - это временное имя, которое вы придумываете. В него по очереди будут помещаться элементы из списка.
-
СПИСОК_ЭЛЕМЕНТОВ - это то, что мы перебираем: слова, числа, имена файлов.
Пример 1: Простой перебор слов
Давайте создадим скрипт, который просто поздоровается с несколькими именами из списка.
Шаг 1: Создание файла
Перейдем в наш каталог со скриптами и создадим новый файл с помощью nano.
cd ~/scripts
nano for_example_1.sh
Шаг 2: Вставка кода
Вставьте в редактор следующий код:
#!/bin/bash
# Простой пример цикла for для перебора списка имен
echo "Начинаем перекличку:"
for name in Иван Мария Петр
do
# Этот блок кода выполнится 3 раза
echo "Привет, $name!"
done
echo "Перекличка окончена."
Как это работает:
-
Цикл for видит список из трех элементов: "Иван", "Мария", "Петр".
-
Первый круг: Он берет "Иван", помещает его в переменную name и выполняет команду echo "Привет, Иван!".
-
Второй круг: Он берет "Мария", помещает его в переменную name и выполняет команду echo "Привет, Мария!".
-
Третий круг: Он берет "Петр", помещает его в переменную name и выполняет команду echo "Привет, Петр!".
-
Список заканчивается, цикл завершает свою работу.
Шаг 3: Сохранение, права и запуск
-
Сохраните файл (Ctrl+O, Enter, Ctrl+X).
-
Дайте права на исполнение:
chmod +x for_example_1.sh
-
Запустите скрипт:
./for_example_1.sh
Пример 2: Практическая задача - обработка файлов
Это самый частый сценарий. Давайте создадим скрипт, который найдет все файлы с расширением .log в текущей папке и выведет информацию о них.
Шаг 1: Подготовка - создадим тестовые файлы
Находясь в папке ~/scripts, создадим несколько пустых файлов для эксперимента:
touch app.log
touch system.log
touch access.log
touch script.sh # Этот файл цикл должен проигнорировать
Шаг 2: Создание файла скрипта
nano for_example_2.sh
Шаг 3: Вставка кода
#!/bin/bash
# Пример использования цикла for для обработки файлов
echo "Поиск лог-файлов в текущем каталоге..."
# Звездочка (*) - это "шаблон", означающий "любые символы".
# Таким образом, *.log - это список всех файлов, заканчивающихся на .log
for logfile in *.log
do
echo "--- Найден файл: $logfile ---"
echo "Выводим первые 2 строки этого файла:"
# Команда head -n 2 показывает первые 2 строки файла
head -n 2 "$logfile"
echo "" # Пустая строка для красоты вывода
done
echo "Обработка лог-файлов завершена."
Шаг 4: Сохранение, права и запуск
-
Сохраните файл.
-
Дайте права на исполнение:
chmod +x for_example_2.sh
-
Запустите:
./for_example_2.sh
Вы увидите, как скрипт по очереди "нашел" каждый .log файл и выполнил для него блок команд.
Часть 3: Практика. Цикл while - повторение до выполнения условия
Синтаксис:
while [ УСЛОВИЕ ]
do
# Блок команд, который будет выполняться
# снова и снова, пока УСЛОВИЕ истинно.
done
-
while, do, done - ключевые слова.
-
[ УСЛОВИЕ ] - это в точности та же самая конструкция для проверки, которую мы использовали в Уроке 13 с if. Используются те же ключи (-eq, -lt, -f и т.д.).
Пример: Простой счетчик
Напишем скрипт, который считает от 1 до 5.
Шаг 1: Создание файла
nano while_example.sh
Шаг 2: Вставка кода
#!/bin/bash
# Пример цикла while, который работает как счетчик
# 1. Инициализируем переменную-счетчик. Даем ей стартовое значение.
COUNTER=1
# 2. Цикл будет работать, ПОКА значение счетчика меньше или равно 5.
while [ $COUNTER -le 5 ]
do
# 3. Выполняем полезное действие
echo "Текущее число: $COUNTER"
# 4. ВАЖНЕЙШИЙ ШАГ: Изменяем счетчик!
# Увеличиваем его значение на 1.
# Если этого не сделать, цикл будет бесконечным!
COUNTER=$((COUNTER + 1))
done
echo "Счет окончен."
Как это работает:
-
Переменной COUNTER присваивается значение 1.
-
while проверяет условие: 1 меньше или равно 5? Да, истина.
-
Выполняется блок do...done: выводится "Текущее число: 1", и COUNTER становится равен 2.
-
Цикл начинается заново. while проверяет условие: 2 меньше или равно 5? Да, истина.
-
...и так далее, пока COUNTER не станет равен 6.
-
while проверяет условие: 6 меньше или равно 5? Нет, ложь.
-
Цикл завершается, и скрипт продолжает работу после слова done.
Шаг 3: Сохранение, права и запуск
-
Сохраните файл.
-
Дайте права на исполнение: chmod +x while_example.sh
-
Запустите: ./while_example.sh
Итоги урока и домашнее задание
-
Что мы освоили:
-
Назначение циклов - автоматизация повторяющихся задач.
-
Цикл for используется для перебора элементов из готового списка.
-
Цикл while используется для повторения действий, пока истинно некое условие.
-
Синтаксис for ... in ... do ... done и while [ ... ] do ... done.
-
Важность изменения условия внутри цикла while во избежание "бесконечных циклов".
-
-
Ваше задание:
Задача - написать скрипт archiver.sh, который найдет все файлы с расширением .txt в папке ~/scripts и для каждого из них создаст отдельный .zip архив.Требования к заданию:
-
Сначала создайте несколько тестовых текстовых файлов в папке ~/scripts. Выполните команду:
touch ~/scripts/doc1.txt ~/scripts/doc2.txt ~/scripts/report.txt
-
Создайте файл скрипта archiver.sh с помощью nano.
-
Используйте цикл for для перебора всех файлов, заканчивающихся на .txt. Шаблон для поиска будет *.txt.
-
Внутри цикла для каждого найденного файла (например, doc1.txt) нужно выполнить команду архивации. Для создания zip-архива используется утилита zip. Если она не установлена, установите ее (apt install zip).
-
Команда для архивации выглядит так: zip имя_архива.zip имя_файла. Ваш скрипт должен создавать архив с таким же именем, как у файла, но с расширением .zip (например, для doc1.txt должен создаться doc1.txt.zip).
-
Внутри цикла добавьте команду echo, которая будет сообщать пользователю, какой файл сейчас архивируется, например: Архивирую файл: doc1.txt...
-
Сделайте скрипт исполняемым и запустите его. После выполнения проверьте командой ls, что у вас появились новые zip-архивы.
-
На следующем, 15-м уроке, мы сделаем наши скрипты еще более профессиональными и структурированными с помощью функций. Мы научимся "упаковывать" повторяющиеся блоки кода в именованные функции, что сделает наши скрипты более читаемыми, легкими в отладке и позволит повторно использовать код, не копируя его. Это фундаментальный шаг к написанию сложных и поддерживаемых программ.
Перейти к просмотру - УРОК №15.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com