for цикл

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

Цикл for в Bash является одной из наиболее важных конструкций для перебора списков слов, файлов, элементов массивов и выполнения команд в скриптах автоматизации. Он имеет синтаксис for item in list; do commands; done, что делает его основным инструментом для выполнения повторяющихся операций в скриптах командной строки Linux. Этот цикл широко используется для обработки файлов, вывода результатов команд и работы с элементами массивов, что делает его незаменимым инструментом в области DevOps и автоматизации.

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

Цикл for в Bash работает следующим образом: for x in word1 word2; do ...; done (итерация по списку слов), for ((i=0; i<10; i++)); do ...; done (итерация по числовой последовательности в стиле C), while cmd; do ...; done (итерация до тех пор, пока команда не завершится с ненулевым кодом возврата), и until cmd; do ...; done (итерация до тех пор, пока команда не завершится с нулевым кодом возврата). Например, для перебора файлов используется конструкция for f in *.txt; do ...; done, которая использует шаблон glob для выборки файлов с расширением .txt. Также можно перебрать элементы массива с помощью for item in "${arr[@]}"; do, что позволяет корректно обрабатывать элементы массива, содержащие пробелы.

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

Цикл for используется в различных сценариях. Например, для обработки файлов можно использовать конструкцию for f in *.log; do, которая перебирает все файлы с расширением .log. Для выполнения команды на каждом элементе списка серверов можно использовать for host in $(cat hosts.txt); do. Важно отметить, что для числовых итераций с точным контролем шага используется конструкция for (( i=0; i<n; i++ )); do, что делает её более чистой и читаемой по сравнению с другими методами итерации.

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

Типичные ошибки при использовании цикла for в Bash включают неправильное использование команды cat для перебора строк файла, что приводит к разделению строк на слова с помощью пробелов. Например, конструкция for line in $(cat file) может привести к некорректному разделению строк на слова, если строки содержат пробелы. Чтобы избежать этого, следует использовать while read -r line; do ...; done < file или < <(cmd). Также следует учитывать, что если в списке файлов нет совпадений, то переменная f будет содержать литерал *.txt, если не активировано опциональное поведение nullglob.

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

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