Библиотека сайта rus-linux.net
Руководство по Bash для начинающих | ||
---|---|---|
Назад | Глава 9: Повторяющиеся задачи | Вперед |
Цикл типа for
Как он работает?
Цикл типа for является первым из трех циклических конструкций, используемых в командной оболочке. Для каждого значения, указанного в цикле, выполняется последовательность команд.
Синтаксис цикла этого типа:
for NAME [in LIST ]; do COMMANDS; done
Если элемента [in LIST] нет, он заменяется на in $@
и for
выполняет каждую команду из COMMANDS для каждого имеющегося позиционного параметра
(смотрите раздел "Специальные
параметры" и раздел "Проверка аргументов командной строки").
Код возврата равен коду возврата последней выполненной команды. Если команды не выполняются из-за того, что в LIST
нет никаких элементов, то код возврата равен нулю.
В качестве NAME
можно использовать любую переменную, хотя очень часто используется переменная i
. В качестве LIST
может быть любой список слов, строк или чисел, которые могут быть литералами, либо могут быть созданы любой командой . Исполняемые команды из COMMANDS также могут быть любыми командами операционной системы, скриптами, программами или инструкциями командной оболочки. При первом выполнении цикла значением NAME
будет значение первого элемента из LIST
. Второй раз значение устанавливается равным значению второго элемента в списке и так далее. Цикл завершится, когда NAME
будет присвоено каждое значение из LIST
и других значений в LIST
больше не будет.
Примеры
Использование подстановок команд для элементов, указываемых в LIST
Первый пример является примером командной строки, демонстрирующий использование цикла for, с помощью которого делаются резервные копии всех файлов .xml
. После того, как команда набрана, ее можно запустить для сохранения ваших исходных кодов:
[carol@octarine ~/articles] ls *.xml file1.xml file2.xml file3.xml [carol@octarine ~/articles] ls *.xml > list [carol@octarine ~/articles] for i in `cat list`; do cp "$i" "$i".bak ; done [carol@octarine ~/articles] ls *.xml* file1.xml file1.xml.bak file2.xml file2.xml.bak file3.xml file3.xml.bak
В следующем примере перечисляются файлы из /sbin
, которые являются простыми текстовыми файлами и, возможно, скриптами:
for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done
Использование содержимого переменной для указания элементов LIST
Ниже приводится конкретный прикладной скрипт, который преобразовывает файлы HTML, соответствующие определенной схеме, в файлы PHP. Преобразование представляет собой замену первых 25 строк и последних 21 строки двумя тегами PHP, которые являются верхним и нижним колонтитулами:
[carol@octarine ~/html] cat html2php.sh #!/bin/bash # specific conversion script for my html files to php LIST="$(ls *.html)" for i in "$LIST"; do NEWNAME=$(ls "$i" | sed -e 's/html/php/') cat beginfile > "$NEWNAME" cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NEWNAME" cat endfile >> "$NEWNAME" done
Поскольку здесь мы не считаем строки, отсутствует возможность узнать номер строки, с которого начинается удаление строк в конце файла. Проблема решается с помощью команды tac, которая меняет порядок строк в файле на обратный.
Команда basename | |
Вместо того, чтобы для замены суффикса |
Спецсимволы | |
Вы столкнетесь с проблемами, если в списке будут имена файлов, содержащие пробелы и другие специальные символы. Более подходящим способом получения списка может быть механизм подстановки, имеющийся в командной оболочке, например: for i in $PATHNAME/*; do commands done |
Предыдущий раздел: | Оглавление | Следующий раздел: |
Подводим итоги главы 8 | Цикл типа while |