Skip to main content

Оператор цикла for

for   <переменная>   in   <список значений>

do

<список команд>

done

Ключевые слова for, do, done пишутся с начала строки.

Пусть имеется три файла: gr1, gr2, gr3, в каждом из которых хранится список студентов данной группы в не отсортированном виде. Нужно создать сводный список студентов по группам в файле studlist.

Следующий командный файл обращается по порядку к каждому из файлов gr1, gr2, gr3, сортирует список соответствующей группы, хранящийся в файле, и добавляет в файл studlist.

Командный файл addlist:

echo "списки групп:"   |   cat   >   studlist ( в файл studlist записываем строку-заголовок)

for   f   in   gr* (или for f in gr1 gr2 gr3) (переменная f последовательно принимает значения gr1, gr2, gr3)

do

echo "группа $f"   |   cat>>   studlist

sort   $f   |   cat>>   studlist

done

Создайте файлы gr1, gr2, gr3, в каждый из которых поместите список из 3-4 фамилий (не в алфавитном порядке). Создайте командный файл addlist, выполните его. Просмотрите полученный файл studlist.

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

Командный файл make3dir:

cd ~

for   i   in   $1   $2   $3

do

mkdir   $i

cd   $i

done

Допустим, что командный файл был запущен следующей командой: make3dir d1 d2 d3, т.е. значение первого параметра $1 - d1, второго параметра $2 - d2, третьего параметра $3 - d3. Переменная i сначала принимает значение первого параметра $1, т.е. i=d1. Поэтому в текущем каталоге создается каталог, имя которого совпадает с i, т.е. каталог d1. Затем этот каталог становится текущим. Далее i принимает значение d2, создается каталог d2 в текущем каталоге (в d1), созданный каталог d2 становится текущим. Далее все повторяется для i=d3.

Создайте командный файл make3dir. Запустите его с параметрами d1 d2 d3. Проверьте создались ли вложенные каталоги (d1 - d2 - d3) в вашем домашнем каталоге?

Задание: Создайте командный файл, который в каталоге d1 создавал бы 2 текстовых файла, имена которых пользователь вводил бы через параметры команды.

Создайте командный файл make3file, который создавал бы в каждом из каталогов d1, d2, d3 текстовые файлы соответственно text1, text2, text3. Имена файлов передаются через параметры командного файла.

Часто используется форма "for i in *", означающая - для всех файлов текущего каталога. Рассмотрим пример:

Командный файл renall:

echo Укажите полное имя каталога

read k

cd   $k

for   i   in *

do

mv   $i   stud$i   (переименовать все файлы и каталоги в текущем каталоге - добавить stud в начало каждого имени).

done

В этом примере используется команда read для ввода значения переменной k пользователем с клавиатуры. Текущим становится каталог, имя которого было введено пользователем и записано в переменную k. Переменная i последовательно пробегает все файлы и каталоги текущего каталога, т.е. значения переменной iпоследовательно соответствуют именам файлов или каталогов, расположенного в каталоге, имя которого передается с помощью параметра (cd $1 - делает текущим указанный каталог).

Создайте командный файл renall, запустите его с параметром d1.

Задание: Напишите командный файл, который будет осуществлять поиск слова, введенного пользователем, во всех файлах текущего каталога. Для поиска используйте команду grep (см. help по этой команде).