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 " прекращает выполнение цикла.
Пустой оператор
|
Пустой оператор имеет формат
:
Ничего не делает. Возвращает значение "0".".
Функции в shell
Функция позволяет подготовить список команд shell для последующего выполнения.
Описание функции имеет вид:
Имя()
{
Список команд
}
после чего обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции - ее нулевой параметр. Прервать выполнение функции можно оператором " return [n] ", где (необязательное) " n " - код возврата.
4.9. Обработка прерываний ("trap")
Бывает необходимо защитить выполнение программы от прерывания.
Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:
выход из интерпретатора, | |
отбой (отключение удаленного абонента), | |
прерывание от <Del>, | |
уничтожение (не перехватывается), | |
окончание выполнения. |
Для защиты от прерываний существует команда " trap ", имеющая формат:
trap 'список команд' сигналы
Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в "сигналы", то будет выполнен "список команд", после чего (если в списке команд не была выполнена команда " exit ") управление вернется в точку прерывания и продолжится выполнение командного файла.
Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в " /tmp ", то это может быть выполнено командой " trap ":
tarp 'rm /tmp/*; exit 1' 1 2 15
|
которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлен выход " exit " из командного файла.
ЛИТЕРАТУРА
1. https://www.citforum.ru/ftp/pub/os/shell-win.zip - Интерпритатор командного языка Shell
2. https://www.citforum.ru/ftp/pub/os/manpages-win.zip – Man Pages на русском
3. https://www.citforum.ru/ftp/pub/os/handbook-win.zip - Free BSD Hand Book руководство пользователя.
[1] Символ “ < ” определяет направление ввода-вывода смотри пункт 3.3.