4.4. Оператор цикла с перечислением ("for")
Оператор цикла "for" имеет структуру:
for имя [in список значений]
do
список команд
done
где "for" - служебное слово определяющее тип цикла,
"do" и "done" - служебные слова, выделяющие тело цикла.
Пусть команда "lsort" представлена командным файлом
for i in file_1 file_2 file_3
do
proc_sort $i
done
В этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать
как shell-переменную, которой последовательно присваиваются перечисленные
значения (i=file_1, i=file_2, i=file_3), и выполняется в цикле команда
"proc_sort".
Часто используется форма "for i in *", означающая "для всех файлов текущего
каталога".
Пусть "proc_sort" в свою очередь представляется командным файлом
cat $1 sort tee /dev/lp > ${1}_sorted
т.е. последовательно сортируются указанные файлы, результаты сортировки
выводятся на печать ("/dev/lp") и направляются в файлы file_1_sorted
file_2_sorted и file_3_sorted
4.5. Оператор цикла с истинным условием ("while")
Структура "while", также обеспечивающая выполнение расчетов, предпочтительнее
тогда, когда неизвестен заранее точный список значений параметров или этот
список должен быть получен в результате вычислений в цикле.
Оператор цикла "while" имеет структуру:
while условие
do
список команд
done
где "while" - служебное слово определяющее тип цикла с истинным условием. Список
команд в теле цикла (между "do" и "done") повторяется до тех пор, пока
сохраняется истинность условия (т.е. код завершения последней команды в теле
цикла равен "0") или цикл не будет прерван изнутри специальными командами
("break", "continue" или "exit"). При первом входе в цикл условие должно
выполняться.
Команда "break [n]" позволяет выходить из цикла. Если "n" отсутствует, то это
эквивалентно "break 1". "n" указывает число вложенных циклов, из которых надо
выйти, например, "break 3" - выход из трех вложенных циклов.
В отличие от команды "break" команда "continue [n]" лишь прекращает выполнение
текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром.
Например, "continue 2" означает выход на начало второго (если считать из
глубины) вложенного цикла.
Команда "exit [n]" позволяет выйти вообще из процедуры с кодом возврата "0" или
"n" (если параметр "n" указан). Эта команда может использоваться не только в
циклах. Даже в линейной последовательности команд она может быть полезна при
отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.
4.6. Оператор цикла с ложным условием ("until")
Оператор цикла "until" имеет структуру:
until условие
do
список команд
done
где "until" - служебное слово определяющее тип цикла с ложным условием. Список
команд в теле цикла (между "do" и "done") повторяется до тех пор, пока
сохраняется ложность условия или цикл не будет прерван изнутри специальными
командами ("break", "continue" или "exit"). При первом входе в цикл условие не
должно выполняться.
Отличие от оператора "while" состоит в том, что условие цикла проверяется на
ложность (на ненулевой код завершения последней команды тела цикла) проверяется
ПОСЛЕ каждого (в том числе и первого!) выполнения команд тела цикла.
Пример.
until false
do
read x
if [ $x = 5 ]
then echo enough ; break
else echo some more
fi
done
Здесь программа с бесконечным циклом ждет ввода слов (повторяя на экране фразу
"some more"), пока не будет введено "5". После этого выдается "enough" и команда
"break" прекращает выполнение цикла.
4.7. Пустой оператор
Пустой оператор имеет формат
:
Ничего не делает. Возвращает значение "0".".
4.8. Функции в shell
Функция позволяет подготовить список команд shell для последующего выполнения.
Описание функции имеет вид:
имя()
{
список команд
}
после чего обращение к функции происходит по имени. При выполнении функции не
создается нового процесса. Она выполняется в среде соответствующего процесса.
Аргументы функции становятся ее позиционными параметрами; имя функции - ее
нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где
(необязательное) "n" - код возврата.
4.9. Обработка прерываний ("trap")
Бывает необходимо защитить выполнение программы от прерывания.
Наиболее часто приходится встречаться со следующими прерываниями,
соответствующими сигналам:
0выход из интерпретатора,
1отбой (отключение удаленного абонента),
2прерывание от <Del>,
9уничтожение (не перехватывается),
15окончание выполнения.
Для защиты от прерываний существует команда "trap", имеющая формат:
trap 'список команд' сигналы
Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в
"сигналы", то будет выполнен "список команд", после чего (если в списке команд
не была выполнена команда "exit") управление вернется в точку прерывания и
продолжится выполнение командного файла.
Например, если перед прекращением по прерываниям выполнения какого то командного
файла необходимо удалить файлы в "/tmp", то это может быть выполнено командой
"trap":
tarp 'rm /tmp/* ; exit 1' 1 2 15
которая предшествует прочим командам файла. Здесь, после удаления файлов будет
осуществлен выход "exit" из командного файла.
... не зависимый от языка способ создания кода и привязки его к запросам Web-страниц, — .NET Web Forms — управляемую событиями программную модель взаимодействия с элементами управления. Она делает программирование Web-страниц аналогичным программированию форм Visual Basic. ASP.NET содержит развитые средства управления сеансами и функции защиты. Она надежнее, и производительность ее значительно выше ...
... "проверки заразности" (taint checks) в Perl? Как их включить? Как мы видели, одна из наиболее часто встречающихся проблем с безопасностью при программировании CGI - передача оболочке ОС пользовательских переменных без их проверки. Perl предлагает механизм проверки "заразности", который не позволяет этого делать. Любая переменная, которая проинициирована данными за пределами программы (включая ...
льный для каждого маршрута): "c: Курсовая моя < название маршрута > .txt" В таких файлах информация представлена например в следующем виде: автобус, 512 водитель, Батуров П.П. кондуктор, Иванова И.И. автобус, 513 водитель, Рябова Т.И. кондуктор, Шишкова Ю.М. автобус, 514 водитель, Продидж Н.Н. кондуктор, Мартысюк С.С. остановка, , 405, 4680 остановка, , 915, 2730 остановка, , ...
... интерфеса и интерфейса локольной сети · Предложение о выборе вариантов загрузки При этом возможен вариант запгрузки как с SCSI устройства (диск, CDROM, лента, …) так и через локальную сеть. Загрузочный диск должен быть предварительно сконфигурирован. Так как обьем Boot ROM не может быть большим, в его задачи входит загрузка вторичного загрузчика ...
0 комментариев