Гид по технологиям

for в Bash: полное руководство по циклу for

6 min read Bash Обновлено 06 Jan 2026
for в Bash: руководство и примеры
for в Bash: руководство и примеры

Женщина объясняет код мужчине.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

Интерфейс терминала Linux

Описание:

  • i — имя переменной, в которую подставляется текущее значение;
  • 1 2 3 — элементы списка;
  • do / done — тело цикла;
  • echo — команда вывода.

Сохраните, дайте права и запустите. Скрипт выведет 3 строки — по одной на итерацию.

2. Диапазон в фигурных скобках

Можно задать диапазон компактно:

for i in {1..3}
do
    echo "Текущий номер $i: Пример 2"
done

Интерфейс терминала Linux

Это эквивалентно перечислению, но короче для последовательных чисел.

3. Диапазон со шагом

Укажите шаг, если нужно пропускать значения:

for i in {1..10..2}
do
    echo "Число = $i"
done

Где {1..10..2} означает старт 1, конец 10, шаг 2 — результат: 1,3,5,7,9.

Интерфейс терминала Linux

Вывод будет иметь фиксированный интервал, заданный шагом.

Перебор строк и символов

Цикл for не ограничен числами. Он отлично работает со строковыми значениями.

1. Перебор списка строк

for name in John Jack Mary
do
  echo "Меня зовут $name"
done

Интерфейс терминала Linux

Это напечатает три строки — по одному имени на итерацию.

2. Логические условия внутри цикла

Вы можете сочетать for с if, чтобы прерывать цикл или выполнять условные действия:

for element in Hydrogen Helium Lithium Beryllium; do
  if [[ "$element" == 'Lithium' ]]; then
    break
  fi
  echo "Элемент: $element"
done

echo 'Готово!'

Условные операторы в Bash

В этом примере цикл прерывается при встрече “Lithium” и до него будут выведены только первые два элемента.

Интерфейс терминала Linux

Перебор вывода команд и файлов

Часто список создают динамически — как вывод команды. Примеры:

Перебор файлов в текущей директории:

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.
  • Учитывайте локаль при сортировке и разборе текста.

Проверка и приёмка: тест-кейсы

Создайте минимальный набор тестов перед развёртыванием скрипта в продакшн:

  1. Тест с пустым списком: скрипт не должен аварийно завершиться.
  2. Тест с именами файлов, содержащими пробелы и спецсимволы.
  3. Тест с большим числом элементов (память/производительность).
  4. Тест на 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.

Типичные ошибки и способы их устранения

  1. Использование $(ls) для перебора файлов. Проблема: некорректная обработка пробелов. Решение: используйте globbing или while read.
  2. Изменение переменной цикла внутри цикла, ожидая, что внешняя переменная изменится. Решение: работайте с копиями или явно экспортируйте значения.
  3. Прерывание цикла сигнатурами ошибок. Решение: проверяйте коды возврата команд и обрабатывайте их.

Безопасность и производительность

  • Не запускайте внешние команды без экранирования аргументов.
  • Для больших коллекций предпочитайте обработку потоков, а не накопление всех значений в памяти.
  • Если операции независимы, рассмотрите 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) может иметь отличия.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Generative Erase в Microsoft Photos — обзор и советы
Фото

Generative Erase в Microsoft Photos — обзор и советы

Играть в Counter-Strike 2 на Mac через CrossOver
Игры

Играть в Counter-Strike 2 на Mac через CrossOver

Отключить затемнение рабочего стола в Windows
Windows

Отключить затемнение рабочего стола в Windows

Вычитание в Google Таблицах — полное руководство
Google Таблицы

Вычитание в Google Таблицах — полное руководство

Как редактировать и сохранять изображения в JES
Руководство

Как редактировать и сохранять изображения в JES

iMessage в iOS 10 — обзор новых возможностей
Мессенджеры

iMessage в iOS 10 — обзор новых возможностей