Руководство по Bash для начинающих | ||
---|---|---|
Назад | Глава 9: Повторяющиеся задачи | Вперед |
Цикл типа for является первым из трех циклических конструкций, используемых в командной оболочке. Для каждого значения, указанного в цикле, выполняется последовательность команд.
Синтаксис цикла этого типа:
for NAME [in LIST ]; do COMMANDS; done
Если элемента [in LIST] нет, он заменяется на in $@ и for выполняет каждую команду из COMMANDS для каждого имеющегося позиционного параметра (смотрите раздел "Специальные параметры" и раздел "Проверка аргументов командной строки").
Код возврата равен коду возврата последней выполненной команды. Если команды не выполняются из-за того, что в LIST нет никаких элементов, то код возврата равен нулю.
В качестве NAME можно использовать любую переменную, хотя очень часто используется переменная i. В качестве LIST может быть любой список слов, строк или чисел, которые могут быть литералами, либо могут быть созданы любой командой . Исполняемые команды из COMMANDS также могут быть любыми командами операционной системы, скриптами, программами или инструкциями командной оболочки. При первом выполнении цикла значением NAME будет значение первого элемента из LIST. Второй раз значение устанавливается равным значению второго элемента в списке и так далее. Цикл завершится, когда NAME будет присвоено каждое значение из 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
Ниже приводится конкретный прикладной скрипт, который преобразовывает файлы 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 | |
Вместо того, чтобы для замены суффикса html на php использовать sed, было бы лучше воспользоваться командой basename. Дополнительную информацию смотрите на странице man. |
Спецсимволы | |
Вы столкнетесь с проблемами, если в списке будут имена файлов, содержащие пробелы и другие специальные символы. Более подходящим способом получения списка может быть механизм подстановки, имеющийся в командной оболочке, например: for i in $PATHNAME/*; do commands done |
Предыдущий раздел: | Оглавление | Следующий раздел: |
Подводим итоги главы 8 | Цикл типа while |