Введение
Представьте, что вам нужно подписать 1 000 писем. Подписать одно письмо легко. Подписать 1 000 писем скучно, к тому же от этого начинает болеть рука. В программировании мы не любим скучные повторяющиеся действия.
Для этого используются циклы. Цикл позволяет сказать компьютеру: «Повторяй это действие для каждого элемента списка или до тех пор, пока не изменится условие».
Циклы лежат в основе автоматизации, потому что компьютеры хорошо справляются с повторениями, а люди — плохо. Если вы замечаете, что снова и снова выполняете одну и ту же последовательность команд, это часто означает, что здесь стоит использовать цикл.
В этой лабораторной работе вы создадите собственные цифровые производственные линии:
- Счётчик: цикл, который считает за вас (цикл
for). - Работник: цикл, который обрабатывает каждый файл в стопке (цикл
forс файлами). - Наблюдатель: цикл, который продолжает работу до тех пор, пока не будет достигнута цель (цикл
while).
Цикл по числам (цикл for)
Цикл for похож на контрольный список. У вас есть список элементов, и для каждого элемента из этого списка выполняется определённое действие.
Это один из самых полезных шаблонов автоматизации в Unix-подобных системах. Компьютеры отлично справляются с последовательным повторением небольшого действия, поэтому циклы позволяют масштабировать задачу для одного элемента до задачи для множества элементов, не копируя одну и ту же команду снова и снова.
Начнём с самого простого списка — чисел. Попросим компьютер посчитать от 1 до 5.
Сначала проверьте рабочий каталог:
cd ~/project
Создайте сценарий с именем num_loop.sh:
nano num_loop.sh
Введите следующий код:
#!/bin/bash
for i in {1..5}; do
echo "Number: $i"
done
Разберём производственную линию:
for i in {1..5}: загрузчик элементов. Он берёт числа 1, 2, 3, 4, 5 и по одному передаёт их переменной$i.do: запускает действие цикла.echo ...: конкретная работа, которую нужно выполнить.done: завершает обработку текущего элемента и возвращается за следующим.
Фрагмент {1..5} — это сокращённая запись Bash, которая называется раскрытием фигурных скобок. До запуска цикла Bash преобразует её в список значений. Поэтому цикл фактически проходит по заранее подготовленному списку, обрабатывая элементы по одному.
Сохраните файл (Ctrl+O) и выйдите (Ctrl+X).
Сделайте сценарий исполняемым и запустите его:
chmod +x num_loop.sh
./num_loop.sh
Вы увидите, как робот считает:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
Цикл по файлам (цикл for)
Считать числа интересно, но обработка файлов приносит больше пользы. Цикл for становится особенно мощным в сочетании с подстановочными символами, например *.txt. Вы можете сказать сценарию: «Для каждого текстового файла в этой папке выполни действие X».
В вашей папке уже созданы примеры текстовых файлов. Напишем сценарий, который найдёт их.
Создайте новый файл с именем file_loop.sh:
nano file_loop.sh
Введите следующий код:
#!/bin/bash
echo "Listing text files:"
for file in *.txt; do
echo "Found file: $file"
done
Логика работы:
Вместо чисел {1..5} мы передаём циклу шаблон *.txt.
BASH просматривает папку, находит все подходящие файлы, например data1.txt и notes.txt, и по одному передаёт их переменной $file.
Сопоставление выполняется до запуска тела цикла. Оболочка раскрывает *.txt в список имён файлов, после чего цикл for проходит по этому списку. Поэтому циклы и шаблоны подстановки так хорошо работают вместе в сценариях оболочки.
Сохраните файл и выйдите из редактора.
Запустите сценарий:
chmod +x file_loop.sh
./file_loop.sh
Результат:
Listing text files:
Found file: data1.txt
Found file: data2.txt
Found file: notes.txt
Представьте, что вместо echo вы использовали mv для перемещения файлов или zip для их архивации. С помощью того же сценария из 4 строк можно обработать 10 000 файлов за несколько секунд!
Цикл с условием (цикл while)
Цикл for отлично подходит, когда у вас есть список чисел или файлов. Но что делать, если списка нет? Что, если вы просто хотите «Продолжать работу, ПОКА не произойдёт определённое событие»?
Для этого нужен цикл while. Он похож на термостат: «Пока в комнате холодно, держи обогреватель включённым».
Напишем сценарий, который вручную считает до 10.
Создайте файл while_loop.sh:
nano while_loop.sh
Введите следующий код:
#!/bin/bash
counter=1
while [ $counter -le 10 ]; do
echo "Count: $counter"
((counter++))
done
Разберём работу термостата:
while [ $counter -le 10 ]: условие. «Счётчик меньше или равен 10?»- Если ДА: войти в цикл.
- Если НЕТ: остановиться.
((counter++)): обновление. Эта команда увеличивает значение счётчика на 1. Важно: если забыть эту строку, счётчик навсегда останется равным 1, а сценарий будет выполняться бесконечно — это называется «бесконечным циклом»!
Это подчёркивает главное различие между for и while. Цикл for обычно получает последовательность от оболочки заранее. Цикл while зависит от условия, которое сценарий должен правильно обновлять во время выполнения.
Синтаксис ((counter++)) — это арифметическая запись Bash. Она указывает оболочке, что counter нужно обрабатывать как число и увеличивать на единицу. В сценариях оболочки часто сочетаются обработка текста и простые арифметические операции, поэтому такой синтаксис встречается очень часто.
Сохраните файл и выйдите из редактора.
Запустите сценарий:
chmod +x while_loop.sh
./while_loop.sh
Сценарий ведёт себя так же, как цикл for, но логика отличается. for проходит по списку. while выполняется, пока истинно условие.
Итоги
Вы создали свои первые механизмы автоматизации.
В этой лабораторной работе вы освоили:
- Контрольный список (
for): обработку заданного списка элементов, например чисел{1..5}. - Пакетный обработчик (
for *.txt): автоматическую обработку каждого файла в каталоге. - Термостат (
while): повторение действий до достижения определённой цели или ограничения.
Эти циклы — рабочие инструменты сценариев. Они превращают 1 000 ручных нажатий в 1 секунду работы компьютера.



