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

Подготовка тестовой среды
Чтобы следовать примерам, нужна рабочая среда с Bash. Bash — стандартная оболочка в Linux, Unix, BSD и, если не используется zsh, в macOS Terminal.
Проверьте текущую оболочку командой:
echo $SHELLОна выведет путь к используемой оболочке, например /bin/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 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

Примечание: фигурные скобки обрабатываются Bash до того, как значения попадут в цикл; они не подходят для генерации больших последовательностей, где нужны вычисления в рантайме.
Обход файлов и каталогов
Частая задача — выполнить команду для группы файлов. Пример: вывести содержимое всех файлов в директории test-directory:
for f in test-directory/*; do
cat "$f"
doneЭто выведет содержимое каждого файла по очереди.

Альтернатива — использовать разбор вывода команды:
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.
Похожие материалы
TOML в Rust: чтение и запись
Анализ тональности на Python с VADER и Tkinter
Проверить прокси в Windows
Темы рабочего стола в Ubuntu 18.04 LTS
Что делать, если Logitech G Pro Wireless не работает