Рефераты. Программирование на языке SHELL (OS UNIX) p>
При обращении к этим переменным (т.е при использовании их в командном файле
- shell-программе) следует впереди ставить "$".
Важную роль при создании уникальных файлов играет специальная переменная
"$$", значение которой соответствует номеру процесса, выполняющего данный расчет. Каждый новый расчет, выполняемый компьютером, инициирует один или несколько процессов, автоматически получающих номера по порядку. Поэтому, используя номер процесса в качестве имени файла, можно быть уверенным, что каждый новый файл будет иметь новое имя (не запишется на место уже существующего). Достоинство является и главным недостатком такого способа именования файлов. Неизвестно, какие имена будут присвоены файлам. И, если в рамках данного процесса можно найти файл "не глядя", т.е., обратившись к нему, используя $$, то потом такие файлы можно легко потерять. Это создает дополнительные проблемы при отладке программ.

3.8. Вызов интерпритатора

Вслед за регистрацией пользователя в системе (с помощью команды login) вызывается интерпретатор языка SHELL. Если регистрационный справочник пользователя содержит файл .profile, то прежде чем с терминала будет принята хотя бы одна команда, интерпретатор выполняет этот файл
(подразумевается, что файл .profile содержит команды). При вызове могут указываться следующие ключи:
-c строка
Команды считываются из заданной строки.
-s
Команды читаются из стандартного файла ввода. Сообщения интерпретатора записываются в стандартный файл диагностик.
-i
Интерактивный режим работы.
Если первым символом параметра "0" является знак -, то команды считываются из файла .profile.


4. ПРОГРАММНЫЕ СТРУКТУРЫ

Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ "#". Все, что находится в строке
(в командном файле) левее этого символа, воспринимается интерпретатором как комментарий. Например,

# Это комментарий.
Как во всяком процедурном языке программирования в языке shell есть операторы. Ряд операторов позволяет управлять последовательностью выполнения команд. В таких операторах часто необходима проверка условия, которая и определяет направление продолжения вычислений.

4.1. Команда test ("[ ]")

Команда test проверяет выполнение некоторого условия. С использованием этой
(встроенной) команды формируются операторы выбора и цикла языка shell.
Два возможных формата команды: test условие или

[ условие ] мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово "test", будем заключать условие в скобки, что более привычно для программистов.
На самом деле shell будет распознавать эту команду по открывающей скобке
"[", как слову, соответствующему команде "test". Между скобками и содержащимся в них условием обязательно должны быть пробелы.
Пробелы должны быть и между значениями и символом сравнения или операции
В shell используются условия различных "типов".
УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ:
|-f file |файл "file" является обычным файлом; |
|-d file |файл "file" - каталог; |
|-с file |файл "file" - специальный файл; |
|-r file |имеется разрешение на чтение файла "file"; |
|-w file |имеется разрешение на запись в файл "file"; |
|-s file |файл "file" не пустой. |

УСЛОВИЯ ПРОВЕРКИ СТРОК:
|str1 = str2 |строки "str1" и "str2" совпадают; |
|str1 != str2 |строки "str1" и "str2" не совпадают; |
|-n str1 |строка "str1" существует (непустая); |
|-z str1 |строка "str1" не существует (пустая). |


Примеры. x="who is who"; export x; [ "who is who" = "$x" ]; echo $?

0 x=abc ; export x ; [ abc = "$x" ] ; echo $?

0 x=abc ; export x ; [ -n "$x" ] ; echo $?

0 x="" ; export x ; [ -n "$x" ] ; echo $?

1
Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки).
УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ:
|x -eq y |"x" равно "y", |
|x -ne y |"x" неравно "y", |
|x -gt y |"x" больше "y", |
|x -ge y |"x" больше или равно "y", |
|x -lt y |"x" меньше "y", |
|x -le y |"x" меньше или равно "y". |


СЛОЖНЫЕ УСЛОВИЯ:
Реализуются с помощью типовых логических операций:
|! |(not) инвертирует значение кода завершения. |
|-o |(or) соответствует логическому "ИЛИ". |
|-a |(and) соответствует логическому "И". |


4.2. Условный оператор "if"

В общем случае оператор "if" имеет структуру if условие then список

[elif условие then список]

[else список] fi
Здесь "elif" сокращенный вариант от "else if" может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов "if"
(как и других операторов). Разумеется "список" в каждом случае должен быть осмысленный и допустимый в данном контексте.
Самая усеченная структура этого оператора if условие then список fi если выполнено условие (как правило это ком получен код завершения "0", то выполняется "список", иначе он пропускается.
Примеры.
Пусть написан "if-1" if [ $1 -gt $2 ] then pwd else echo $0 : Hello! fi
Тогда вызов if-1 12 11 даст /home/sae/STUDY/SHELL а if-1 12 13 даст if-1 : Hello!

4.3. Оператор вызова ("case")

Оператор выбора "case" имеет структуру: case строка in шаблон) список команд;; шаблон) список команд;;

... шаблон) список команд;; esac
Здесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки.
Непривычно выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд.
Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд.
Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.

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 |прерывание от , |
|9 |уничтожение (не перехватывается), |
|15 |окончание выполнения. |


Для защиты от прерываний существует команда "trap", имеющая формат: trap 'список команд' сигналы
Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в
"сигналы", то будет выполнен "список команд", после чего (если в списке команд не была выполнена команда "exit") управление вернется в точку прерывания и продолжится выполнение командного файла.
Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в "/tmp", то это может быть выполнено командой "trap": tarp 'rm /tmp/* ; exit 1' 1 2 15 которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлен выход "exit" из командного файла.

5. ЛИТЕРАТУРА

1. http://www.citforum.ru/ftp/pub/os/shell-win.zip - Интерпритатор командного языка Shell

2. http://www.citforum.ru/ftp/pub/os/manpages-win.zip – Man Pages на русском

3. http://www.citforum.ru/ftp/pub/os/handbook-win.zip - Free BSD Hand

Book руководство пользователя.
-----------------------
[1] Символ “


Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.