Оператор цикла "for" имеет структуру:
for имя [in список значений] do список команд done
Пусть команда "lsort" представлена командным файлом
for i in f1 f2 f3 do proc-sort $i done
Часто используется форма "for i in *", означающая "для всех файлов текущего каталога".
Пусть "proc-sort" в свою очередь представляется командным файлом
cat $1 | sort | tee /dev/lp > ${1}_sorted
f1_sorted f2_sorted и f3_sorted
Тогда головная программа будет следующей:
for i do proc-sort $i done
lsort f1 f2 f3
### # holding: Справочник. # Для различных фирм по имени выдается # название холдинга, в который она входит for i do case $i in ONE|TWO|THREE) echo Холдинг: ZERO ;; MMM|WWW) echo Холдинг: Not-Net ;; Hi|Hello|Howdoing) echo Холдинг: Привет! ;; *) echo Нет такой фирмы ;; esac done
Холдинг: Привет! Нет такой фирмы Холдинг: Not-Net
### # subdir: Выдает имена всех поддиректориев # директория с именем $dir for i in $dir/* do if [ -d $i ] then echo $i fi done
### # print-5: Организации пятикратного выполнения команды for i in 1 2 3 4 5 do cat file-22 > /dev/lp done
### # print-n: Задание числа копий # через параметры for i do cat file-22 > /dev/lp done
for i in $*
Отметим различие в специальных переменных "$*" и "$@", представляющих перечень параметров. Первый представляет параметры, как строку, а второй, как совокупность слов.
Пусть командный файл "cmp" имеет вид:
for i in "$*" do echo $i done echo for i in "$@" do echo $i done
cmp aa bb cc
aa bb cc aa bb cc
Структура "while", также обеспечивающая выполнение расчетов, предпочтительнее тогда, когда неизвестен заранее точный список значений параметров или этот список должен быть получен в результате вычислений в цикле.
Оператор цикла "while" имеет структуру:
while условие do список команд done
### # print-50: Структура "while" # Расчет позволяет напечатать 50 # экземпляров файла "file-22" n=0 while [ $n -lt 50 ] # пока n < 50 do n=`expr $n + 1` cat file-22 > /dev/lp done
n=`expr $n + 1`
Как и вообще в жизни, можно реализовать то же самое и сложнее. Расчет "рr-br" приведен для иллюстрации бесконечного цикла и использования команды "break", которая обеспечивает прекращение цикла.
### # рr-br: Структура "while" c "break" # Расчет позволяет напечатать 50 # экземпляров файла "file-22" n=0 while true do if [ $n -lt 50 ] # если n < 50 then n=`expr $n + 1` else break fi cat file-22 > /dev/lp done
В отличие от команды "break" команда "continue [n]" лишь прекращает выполнение текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например, "continue 2" означает выход на начало второго (если считать из глубины) вложенного цикла.
Команда "exit [n]" позволяет выйти вообще из процедуры с кодом возврата "0" или "n" (если параметр "n" указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.