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 могут включать следующие:
- Использование
for line in $(cat file)вместоwhile read -r line. Этот подход может привести к проблемам с разделением слов по пробелам. - Использование
for f in *.txtбезnullglob. Это может привести к итерации по литералу*.txtв случае отсутствия совпадений. - Модификация переменной внутри
while ... | cmd-пайплайна. Изменения переменной внутри подобной конструкции не сохраняются за пределами подоболочки.