Оператор цикла 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 по этой команде).