Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по 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

Вместо того, чтобы для замены суффикса html на php использовать sed, было бы лучше воспользоваться командой basename. Дополнительную информацию смотрите на странице man.

 Спецсимволы

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

for i in $PATHNAME/*; do
        commands
done

Предыдущий раздел: Оглавление Следующий раздел:
Подводим итоги главы 8   Цикл типа while