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

Цикл for в Bash: практическое руководство

4 min read DevOps Обновлено 05 Dec 2025
Цикл for в Bash: практическое руководство
Цикл for в Bash: практическое руководство

Кратко

Кратко: цикл for в Bash позволяет последовательно выполнять команды для набора значений — числовых диапазонов, списков файлов или выводов других команд. Этот материал объясняет базовую синтаксис, примеры с числами и файлами, типичные ошибки и практические шаблоны для автоматизации задач.

Важно: все примеры предполагают рабочую оболочку Bash и базовые навыки работы с терминалом.

Почему это важно

Автоматизация однотипных операций экономит время и снижает количество ошибок. Цикл for — один из фундаментальных инструментов в скриптах для системных администраторов, DevOps-инженеров и пользователей Linux/Unix/macOS.

Изображение демонстрирует заголовок статьи и оборудование для работы с Bash

Подготовка тестовой среды

Чтобы следовать примерам, нужна рабочая среда с Bash. Bash — стандартная оболочка в Linux, Unix, BSD и, если не используется zsh, в macOS Terminal.

Проверьте текущую оболочку командой:

echo $SHELL

Она выведет путь к используемой оболочке, например /bin/bash.

Скриншот терминала с выводом информации об оболочке Bash

Нужен текстовый редактор. В терминале подойдёт nano, vim или emacs; в GUI — gedit, Kate, Sublime и др. Создайте файл скрипта, например:

ano for-loop-test.sh

Сделайте файл исполняемым:

chmod +x for-loop-test.sh

Основы синтаксиса for

Цикл for указывает оболочке пройти по набору элементов и выполнить блок команд для каждого элемента.

Простой пример:

for i in 1 2 3 4 5; do
  echo "Test round $i"
done

Вывод будет:

Test round 1
Test round 2
Test round 3
Test round 4
Test round 5

Иллюстрация простого цикла for в Bash

Объяснение:

  • for i in ... — объявление переменной i и набора значений.
  • do и done — границы блока, выполняемого для каждого значения.
  • Внутри блока можно использовать переменную i.

Диапазоны и шаги

Чтобы задать числовой диапазон компактно, используйте конструкцию в фигурных скобках:

for i in {1..5}; do
  echo "Number $i"
done

Для указания шага:

for i in {0..27..3}; do
  echo "Step $i"
done

Пример подсчёта с шагом в цикле for

Вывод подсчёта с шагом каждые 3 единицы

Примечание: фигурные скобки обрабатываются Bash до того, как значения попадут в цикл; они не подходят для генерации больших последовательностей, где нужны вычисления в рантайме.

Обход файлов и каталогов

Частая задача — выполнить команду для группы файлов. Пример: вывести содержимое всех файлов в директории test-directory:

for f in test-directory/*; do
  cat "$f"
done

Это выведет содержимое каждого файла по очереди.

Обход файлов в каталоге с помощью цикла for

Альтернатива — использовать разбор вывода команды:

for f in $(ls test-directory); do
  echo "Файл: $f"
done

Важно: разбор вывода ls или других команд без корректной обработки пробелов в именах файлов может привести к ошибкам. Предпочтительнее использовать glob-выражения (например, test-directory/*) и оборачивать переменные в кавычки.

Пример списка файлов и их свойств

Вывод может выглядеть так:

Вывод содержимого файлов после выполнения цикла

Комбинирование команд и условий

Между do и done можно выполнить несколько команд и использовать условные операторы:

for f in *.log; do
  if [ -s "$f" ]; then
    gzip "$f"
    echo "Archived $f"
  else
    echo "Empty: $f"
  fi
done

Этот пример архивирует ненулевые по размеру лог‑файлы.

Когда цикл for не подходит

Важно понимать ограничения и альтернативы:

  • Большие наборы данных: если список элементов слишком велик, генерация всех значений в памяти может быть неэффективной. Рассмотрите while read с потоковой обработкой.
  • Параллелизация: for выполняет итерации последовательно. Для параллельной обработки используйте GNU parallel, xargs -P или фоновые задачи с контролем процессов.
  • Сложный разбор вывода команд: избежайте разбиения строк по пробелам — используйте массивы или правильное считывание через read.

Альтернативные подходы

  • while read loop:
find . -type f -print0 | while IFS= read -r -d '' file; do
  # обработка $file
done
  • xargs для параллельного выполнения:
find . -name "*.jpg" -print0 | xargs -0 -n1 -P4 convert -resize 800x600
  • mapfile/readarray для чтения в массив:
mapfile -t lines < filelist.txt
for l in "${lines[@]}"; do
  echo "$l"
done

Ментальные модели и эмпирические правила

  • Всегда оборачивайте переменные в двойные кавычки, чтобы защититься от пробелов и спецсимволов.
  • Для работы с путями используйте glob-выражения, а не парсинг вывода ls.
  • Для больших потоков данных думайте в терминах потоковой обработки, а не генерации полного списка заранее.

Справочный набор (cheat sheet)

  • Базовый цикл:
for var in list; do
  commands
done
  • Диапазон:
{start..end[..step]}
  • Безопасный обход файлов:
for f in /path/*; do
  [ -f "$f" ] && echo "$f"
done
  • Запуск в фоне (с контролем):
for i in {1..10}; do
  task "$i" &
  jobs -p | wc -l | while [ $(cat) -gt 20 ]; do sleep 1; done
done
wait

Ролевые чек‑листы

  • Для системного администратора:

    • Проверить корректность путей и прав доступа
    • Тестировать на небольшом наборе файлов
    • Логировать действия и ошибки
  • Для разработчика скриптов автоматизации:

    • Обрабатывать возможные пустые списки
    • Использовать кавычки и проверку на ошибки
    • Добавлять опцию «dry run» для критичных операций

Тестовые случаи и критерии приёмки

  • Скрипт должен корректно обрабатывать имена файлов с пробелами.
  • Пустой список файлов не должен приводить к аварии скрипта.
  • Скрипт должен возвращать ненулевой код при критической ошибке.

Критерии приёмки:

  • Примеры работают в чистой Bash-среде (версия 4+ желательна).
  • Нет модификаций файлов без подтверждения в режиме dry run.

Краткий глоссарий

  • glob — шаблон имени файла (например, *.txt).
  • stdout — стандартный поток вывода.
  • argv — позиционные параметры скрипта.

Заключение

Цикл for в Bash — простой, но мощный инструмент для повторяющихся операций. Он отлично подходит для обработки списков файлов и небольших числовых диапазонов. Для потоковой обработки больших наборов и параллельных задач лучше сочетать for с другими утилитами: find, xargs, parallel или read-петлями.

Важно: всегда тестируйте скрипты на безопасных данных перед применением в продакшене.

Короткое содержание:

  • Изучите базовый синтаксис и используйте кавычки.
  • Предпочитайте glob-выражения парсингу команд.
  • При больших объёмах данных думайте о потоковой обработке и параллелизации.

Спасибо за чтение. Не забудьте посмотреть дополнительные материалы по Bash: советы по работе в терминале и список специальных символов Bash.

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

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

TOML в Rust: чтение и запись
Программирование

TOML в Rust: чтение и запись

Анализ тональности на Python с VADER и Tkinter
Обработка текста

Анализ тональности на Python с VADER и Tkinter

Проверить прокси в Windows
Безопасность

Проверить прокси в Windows

Темы рабочего стола в Ubuntu 18.04 LTS
Linux

Темы рабочего стола в Ubuntu 18.04 LTS

Что делать, если Logitech G Pro Wireless не работает
Техподдержка

Что делать, если Logitech G Pro Wireless не работает

Dev Drive в Windows 11 — как начать
Разработка

Dev Drive в Windows 11 — как начать