while цикл

Тема дорожной карты · Bash

Цикл while — одна из трёх основных конструкций цикла в Bash (наряду с for и until) и выполняет блок команд повторно до тех пор, пока его условие вычисляется как истинное (код завершения 0). Этот цикл является ключевым элементом для создания скриптов, которые могут повторно выполнять определённые действия до тех пор, пока не будет достигнута определённая цель. Синтаксис while condition; do commands; done является стандартным POSIX и работает в любой оболочке, что делает его переносимой практикой написания shell-скриптов для итерации в автоматизации Linux. Наиболее идиоматичное применение цикла while в Bash — построчное чтение ввода: while IFS= read -r line; do ...; done < file.txt корректно обрабатывает каждую строку, сохраняя пробелы и обратные слэши — флаги IFS= и -r необходимы для предотвращения искажения ввода и являются стандартным шаблоном написания Bash-скриптов. Цикл while также обеспечивает логику опроса и повторных попыток в скриптах автоматизации Linux — например, цикл до исчезновения файла блокировки или до ответа сетевого сервиса — и поддерживает встроенные команды break и continue для управления потоком внутри тела цикла. Освоение цикла while, особенно шаблона while read, является основой для обработки текста, разбора журналов и преобразования данных в Bash-скриптах.

Как это работает

Цикл while выполняет блок команд, пока условие остается истинным. Синтаксис цикла while в Bash выглядит следующим образом:

while condition; do
    commands
done

Наиболее распространённое применение цикла while — это построчное чтение содержимого файла:

while IFS= read -r line; do
    # Обработка строки
done < file.txt

Этот подход позволяет корректно обрабатывать каждую строку, сохраняя пробелы и обратные слэши. Флаги IFS= и -r играют ключевую роль в предотвращении искажения ввода.

Когда применять

Цикл while особенно полезен для построчной обработки файлов. Например, если вам нужно прочитать и обработать каждую строку из текстового файла, вы можете использовать конструкцию while read. Нужно избегать использования for line in $(cat file) из-за возможных проблем с разделением слов по пробелам. Вместо этого следует использовать while read -r line; do ...; done < file.

Для обработки имен файлов, которые могут содержать символы новой строки, можно использовать следующий подход:

find ... -print0 | while IFS= read -r -d "" f; do
    # Обработка файла
done

Также стоит отметить, что использование for f in *.txt предпочтительнее по сравнению с ls *.txt | while read. Глобальная расстановка (glob) является более безопасной альтернативой парсингу ls.

Типичные ошибки

Типичные ошибки при использовании цикла while могут включать следующие:

Связанные понятия

Полезные ресурсы