for в Bash: полное руководство по циклу for
.jpg?q=50&fit=crop&w=1100&h=618&dpr=1.5)
Циклы — это основной инструмент автоматизации. Вместо ручного редактирования одинаковых строк или запуска однотипных команд вы даёте системе набор правил и разрешаете ей повторять действия. В Bash цикл for — один из самых простых и часто используемых видов циклов.
В этом руководстве вы найдёте:
- базовый синтаксис цикла for в shell;
- примеры для целых чисел, диапазонов с шагом и строк;
- условные операторы внутри цикла (break/continue);
- альтернативы и лучшие практики;
- чек-листы для безопасного запуска и тест-кейсы.
Основная структура цикла for
Простой синтаксис в shell понятен и гибок. В Bash он чаще всего выглядит так:
for item in [LIST]
do
[COMMANDS]
doneВместо [LIST] вы можете подставить список значений, диапазон, результат команды или массив. Тело цикла (между do и done) выполняется для каждого элемента списка.
Пример, где явно перечислены значения:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
doneКоличество итераций равно числу элементов в списке. Это простая, но мощная модель: укажите набор и опишите действие — Bash выполнит его для каждого элемента.
Создание и запуск скрипта с for в Linux
Откройте терминал и создайте файл скрипта в любимом текстовом редакторе. В примерах ниже используется nano.
Откройте файл:
nano ForLoops.shРасширение .sh не обязательно, но помогает идентифицировать файл как shell-скрипт. Сохраните и закройте редактор, затем сделайте файл исполняемым:
chmod +x ForLoops.shЗапустите скрипт:
./ForLoops.shВажно: проверяйте shebang (первая строка) — он определяет, какой интерпретатор будет запускать скрипт. Для совместимости часто используют #!/usr/bin/env bash или #!/usr/bin/bash.
Печать целых чисел с помощью for
1. Перебор явного списка чисел
Откройте файл и вставьте:
#!/usr/bin/bash
for i in 1 2 3
do
echo "Текущий номер $i"
doneОписание:
- i — имя переменной, в которую подставляется текущее значение;
- 1 2 3 — элементы списка;
- do / done — тело цикла;
- echo — команда вывода.
Сохраните, дайте права и запустите. Скрипт выведет 3 строки — по одной на итерацию.
2. Диапазон в фигурных скобках
Можно задать диапазон компактно:
for i in {1..3}
do
echo "Текущий номер $i: Пример 2"
doneЭто эквивалентно перечислению, но короче для последовательных чисел.
3. Диапазон со шагом
Укажите шаг, если нужно пропускать значения:
for i in {1..10..2}
do
echo "Число = $i"
doneГде {1..10..2} означает старт 1, конец 10, шаг 2 — результат: 1,3,5,7,9.
Вывод будет иметь фиксированный интервал, заданный шагом.
Перебор строк и символов
Цикл for не ограничен числами. Он отлично работает со строковыми значениями.
1. Перебор списка строк
for name in John Jack Mary
do
echo "Меня зовут $name"
doneЭто напечатает три строки — по одному имени на итерацию.
2. Логические условия внутри цикла
Вы можете сочетать for с if, чтобы прерывать цикл или выполнять условные действия:
for element in Hydrogen Helium Lithium Beryllium; do
if [[ "$element" == 'Lithium' ]]; then
break
fi
echo "Элемент: $element"
done
echo 'Готово!'В этом примере цикл прерывается при встрече “Lithium” и до него будут выведены только первые два элемента.
Перебор вывода команд и файлов
Часто список создают динамически — как вывод команды. Примеры:
Перебор файлов в текущей директории:
for file in $(ls *.txt)
do
echo "Файл: $file"
doneГораздо безопаснее использовать globbing (оно корректно обрабатывает пробелы в именах):
for file in ./*.txt
do
echo "Файл: $file"
doneПеребор строк из вывода другой команды:
for user in $(cut -d: -f1 /etc/passwd)
do
echo "Пользователь: $user"
doneЕсли вывод может содержать пробелы или специальные символы, рассматривайте read -r и while-петлю:
command | while IFS= read -r line; do
echo "Строка: $line"
doneЭтот приём безопаснее для произвольного ввода.
Альтернативы и когда выбирать другой подход
- while/until: удобны для циклов с условием (пока истина) или для чтения потоковых данных.
- C-style for: Bash поддерживает form-подобный синтаксис: for ((i=0;i<10;i++)); do …; done — полезно при арифметике.
- seq и xargs: для сложной генерации последовательностей и параллельной обработки.
Когда не следует использовать for:
- Когда количество итераций заранее неизвестно и цикл должен реагировать на внешние события — лучше while.
- При работе с бинарными файлами или произвольными байтовыми потоками — используйте инструменты, которые не разделяют данные по пробелам.
Лучшие практики и безопасное использование
- Всегда ставьте правильный shebang (#/usr/bin/env bash).
- Обрабатывайте имена файлов с пробелами: используйте globbing или while read.
- Избегайте командной подстановки $(ls …) для перебора файлов — используйте шаблоны (glob).
- Для арифметики используйте (( … )) или команду let.
- Учитывайте локаль при сортировке и разборе текста.
Проверка и приёмка: тест-кейсы
Создайте минимальный набор тестов перед развёртыванием скрипта в продакшн:
- Тест с пустым списком: скрипт не должен аварийно завершиться.
- Тест с именами файлов, содержащими пробелы и спецсимволы.
- Тест с большим числом элементов (память/производительность).
- Тест на idempotence: повторный запуск не должен ломать состояние.
Критерии приёмки:
- Скрипт выполняет требуемые действия для всех элементов списка.
- Скрипт корректно завершает работу при ошибке (return code) и печатает диагностические сообщения.
- Нет незапланированных побочных эффектов (удаление, перезапись).
Чек-лист ролей (Dev / Ops / Reviewer)
Разработчик:
- shebang и режим исполнения установлены
- проверка входных данных присутствует
- обработка ошибок и exit-коды
Операции (Ops):
- окружение (PATH, локаль) документировано
- логирование и ротация логов настроены
- права доступа к конфигурациям и файлам корректны
Ревьювер:
- проверено поведение при пустом вводе
- проверено поведение при ошибках команд в теле цикла
- проверено отсутствие команд с расширенными правами без контроля
Шпаргалка (cheat sheet)
- Перечисление явных значений:
for x in a b c; do echo $x; done- Диапазон:
for i in {1..5}; do echo $i; done- Диапазон со шагом:
for i in {0..10..2}; do echo $i; done- C-style:
for ((i=0;i<10;i++)); do echo $i; done- Перебор файлов:
for f in ./*.log; do echo "$f"; done- Безопасная обработка вывода команд:
some_cmd | while IFS= read -r line; do process "$line"; doneМентальные модели и эвристики
- “Дай списку — и я сделаю действие для каждого элемента”: думайте о for как о маппинге операции на коллекцию.
- Если вы выполняете побочные эффекты на каждый элемент (запись в БД, отправка писем) — учитывайте идемпотентность.
- Для потоковых данных используйте while, для наборов — for.
Типичные ошибки и способы их устранения
- Использование $(ls) для перебора файлов. Проблема: некорректная обработка пробелов. Решение: используйте globbing или while read.
- Изменение переменной цикла внутри цикла, ожидая, что внешняя переменная изменится. Решение: работайте с копиями или явно экспортируйте значения.
- Прерывание цикла сигнатурами ошибок. Решение: проверяйте коды возврата команд и обрабатывайте их.
Безопасность и производительность
- Не запускайте внешние команды без экранирования аргументов.
- Для больших коллекций предпочитайте обработку потоков, а не накопление всех значений в памяти.
- Если операции независимы, рассмотрите xargs -P для параллелизации, но контролируйте количество процессов.
Примеры реальных сценариев
- Переименование группы файлов по шаблону.
- Масовая конверсия изображений (ImageMagick) в цикле.
- Отправка уведомлений нескольким пользователям из списка.
- Сбор и агрегация логов: пройти по файлам и вытащить метрики.
Decision flow: выбрать for или другую конструкцию
flowchart TD
A[Есть конечный список элементов?] -->|Да| B[Использовать for]
A -->|Нет| C[Данные приходят потоково]
C --> D[Использовать while/read]
B --> E[Нужна арифметика индекса?]
E -->|Да| F[Рассмотреть C-style for ''...'']
E -->|Нет| G[Обычный for с перечислением или glob]Короткая сводка и советы
- for в Bash прост и универсален — используйте его для заранее известных списков.
- Для потоковых и потенциально «грязных» данных применяйте while read и защищённую обработку пробелов.
- Проверяйте поведение при пустом вводе и ошибки команд.
Важно: всегда тестируйте скрипт в безопасной среде перед применением на продакшн-данных.
Краткое резюме:
Цикл for — эффективный инструмент автоматизации в Bash. Он подходит для числовых последовательностей, списков строк и вывода команд. Знайте альтернативы (while, C-style) и используйте безопасные шаблоны при работе с файлами и незнакомыми данными.
Примечание: это руководство ориентировано на Bash; синтаксис в других shell (sh, zsh) может иметь отличия.
Похожие материалы