Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Лабораторная работа №2 «программирование на языке Shell в ОС unix»Содержание книги
Поиск на нашем сайте
Цель работы
Изучение языка Shell, использование переменных среды, переменных Shell и предопределенных переменных.
Программирование в языке Shell
Версии Shell Shell — интерпретатор команд, подаваемых с терминала или из командного файла. Это обычная программа (т.е. не входит в ядро операционной системы UNIX). Ее можно заменить на другую или иметь несколько. Две наиболее известные версии: - Shell (версии 7 UNIX) или Bourne Shell (от фамилии автора S.R.Bourne из фирмы Bell Labs); - C-Shell (версии Berkley UNIX). Они похожи, но есть и отличия: C-Shell мощнее в диалоговом режиме, а обычный Shell имеет более элегантные управляющие структуры. Shell — язык программирования, так как имеет: - переменные; - управляющие структуры (типа if); - подпрограммы (в том числе командные файлы); - передачу параметров; - обработку прерываний.
Файл начала сеанса (login-файл) Независимо от версии Shell при входе в систему UNIX ищет файл начала сеанса с предопределенным именем, чтобы выполнить его как командный файл; - для UNIX версии 7 это:.profile; - для C-Shell это:.login и/или.cshrc. В этот файл обычно помещают команды: - установки характеристик терминала; - оповещения типа who, date; - установки каталогов поиска команд (обычно: /bin, /usr/bin); - смена подсказки с $ на другой символ и т.д.
Процедура языка Shell Это командный файл. Два способа его вызова на выполнение: 1. $ sh dothat (где dothat — некоторый командный файл); 2. $ chmod 755 dothat (сделать его выполнимым, т.е. -rwxr-xr-x) $ dothat. Следует знать порядок поиска каталогов команд (по умолчанию): - текущий; - системный /bin; - системный /usr/bin. Следовательно, если имя вашего командного файла дублирует имя команды в системных каталогах, последняя станет недоступной (если только не набирать ее полного имени).
Переменные Shell В языке Shell версии 7 определение переменной содержит имя и значение: var = value. Доступ к переменной — по имени со знаком $ спереди: fruit = apple (определение); echo $fruit (доступ); apple (результат echo).
Таким образом, переменная — это строка. Возможна конкатенация строк: $ fruit = apple $ fruit = pine$fruit $ echo $fruit pineapple $ fruite = apple $ wine = ${fruite}jack $ echo $wine applejack $
Другие способы установки значения переменной — ввод из файла или вывод из команды, а также присваивание значений переменной — параметру цикла for из списка значений, заданного явно или по умолчанию. Переменная может быть: - Частью полного имени файла: $d/filename, где $d — переменная (например, d = /usr/bin). - Частью команды: $ S = "sort + 2n + 1 - 2" (наличие пробелов требует кавычек "") $ $S tennis/lpr $ $S basketball/lpr $ $S pingpong/lpr $
Однако внутри значения для команды не могут быть символы |, >, <, & (обозначающие канал, перенаправления и фоновый режим).
Предопределенные переменные Shell Некоторые из них можно только читать. Наиболее употребительные: HOME — "домашний" каталог пользователя; служит аргументом по умолчанию для cd; PATH — множество каталогов, в которых UNIX ищет команды; PS1 — первичная подсказка (строка) системы (для v.7 - $). Изменение PS1 (подсказки) обычно делается в login-файле, например: PS1 =? или PS1 = "? " (с пробелом, что удобнее). Изменение PATH: $ echo $PATH - посмотреть; :/bin:/usr/bin - значение PATH; $ cd - "домой"; $ mkdir bin - новый каталог; $ echo $HOME - посмотреть; /users/maryann - текущий каталог; $ PATH =:$HOME/bin:$PATH - изменение PATH; $ echo $PATH - посмотреть; :/users/maryann/bin:/bin:/usr/bin - новое значение PATH.
Установка переменной Shell выводом из команды Пример 1: $ now = `date` (где `` - обратные кавычки) $ echo $now Sun Feb 14 12:00:01 PST 1985 $
Пример 2: (получение значения переменной из файла): $ menu = `cat food` $ echo $menu apples cheddar chardonnay (символы возврата каретки заменяются на пробелы).
Переменные Shell — аргументы процедур Это особый тип переменных, именуемых цифрами. Пример: $ dothis grapes apples pears (процедура).
Тогда позиционные параметры (аргументы) этой команды доступны по именам: $1 = `grapes` $2 = `apples` $3 = `pears` и т.д. до $9. Однако есть команда shift, которая сдвигает имена на остальные аргументы, если их больше 9 (окно шириной 9). Другой способ получить все аргументы (даже если их больше 9): $*, что эквивалентно $1$2... Количество аргументов присваивается другой переменной: $#(диез). Наконец, имя процедуры - это $0; переменная $0 не учитывается при подсчете $#.
Структурные операторы Shell
Оператор цикла for Пусть имеется командный файл makelist (процедура) $ cat makelist sort +1 -2 people | tr -d -9 | pr -h Distribution | lpr.
Если вместо одного файла people имеется несколько, например: adminpeople, hardpeople, softpeople,..., то необходимо повторить выполнение процедуры с различными файлами. Это возможно с помощью for — оператора. Синтаксис:
for <переменная> in <список значений> do <список команд> done
Ключевые слова for, do, done пишутся с начала строки. Пример (изменим процедуру makelist): for file in adminpeople, hardpeople, softpeople do Sort +1 -2 $file | tr... | lpr done. Можно использовать метасимволы Shell в списке значений. Пример: for file in *people (для всех имен, кончающихся на people) do ... done.
Если in опущено, то по умолчанию в качестве списка значений берется список аргументов процедуры, в которой содержится цикл, а если цикл не в процедуре, то — список параметров командной строки (то есть в качестве процедуры выступает команда). Пример: for file do ... done
Для вызова makelist adminpeople hardpeople softpeople будет сделано то же самое.
Условный оператор if Используем имена переменных, представляющие значения параметров процедуры: sort +1 -2 $1 | tr... | lpr
Пример неверного вызова: makelist (без параметров), где $1 неопределен. Исправить ошибку можно, проверяя количество аргументов – значение переменной $# посредством if - оператора. Пример: (измененной процедуры makelist): if test $# -eq 0 then echo "You must give a filename" exit 1 else sort +1 -2 $1 | tr... | lpr fi Здесь test и exit - команды проверки и выхода. Таким образом, синтаксис оператора if: if <если эта команда выполняется успешно, то>; then <выполнить все следующие команды до else или, если его нет, до fi>; [else <иначе выполнить следующие команды до fi>]
Ключевые слова if, then, else и fi пишутся с начала строки. Успешное выполнение процедуры означает, что она возвращает значение true = 0 (zero) (неуспех - возвращаемое значение не равно 0). Оператор exit 1 задает возвращаемое значение 1 для неудачного выполнения makelist и завершает процедуру. Возможны вложенные if. Для else if есть сокращение elif, которое одновременно сокращает fi.
Команда test Не является частью Shell, но применяется внутри Shell-процедур. Имеется три типа проверок: - оценка числовых значений; - оценка типа файла; - оценка строк. Для каждого типа свои примитивы (операции op). 1. Для чисел синтаксис такой: N op M, где N, M - числа или числовые переменные; op принимает значения: -eq, -ne, gt, -lt, -ge, -le. 2. Для файла синтаксис такой: op filename, где op принимает значения: - -s (файл существует и не пуст); - -f (файл, а не каталог); - -d (файл-директория (каталог); - -w (файл для записи); - -r (файл для чтения). Для строк синтаксис такой: S op R, где S, R - строки или строковые переменные или op1 S, где op принимает значения: - = (эквивалентность); -!= (не эквивалентность); op1 принимает значения: - -z (строка нулевой длины); - -n (не нулевая длина строки). Наконец, несколько проверок разных типов могут быть объединены логическими операциями -a (AND) и -o (OR). Примеры: $ if test -w $2 -a -r S1 > then cat $1 >> $2 > else echo "cannot append" > fi $
В некоторых вариантах ОС UNIX вместо команды test используются квадратные скобки, т.е. if [...] вместо if test....
Оператор цикла while Синтаксис: while <команда> do <команды> done
Если "команда" выполняется успешно, то выполнить "команды", завершаемые ключевым словом done. Пример: if test $# -eq 0 then echo "Usage: $0 file..." > &2 exit fi while test $# -gt 0 do if test -s $1 then echo "no file $1" > &2 else sort + 1 - 2 $1 | tr -d... (процедуры) fi shift (* перенумеровать аргументы *) done Процедуры выполняются над всеми аргументами.
Оператор цикла until Инвертирует условие повторения по сравнению с while Синтаксис: until <команда> do <команды> done Пока "команда" не выполнится успешно, выполнять команды, завершаемые словом done. Пример: if test S# -eq 0 then echo "Usage $0 file..." > &2 exit fi until test S# -eq 0 do if test -s $1 then echo "no file $1" > &2 else sort +1 -2 $1 | tr -d... (процедура) fi shift (сдвиг аргументов) done
Исполняется аналогично предыдущему.
Оператор выбора case Синтаксис: case <string> in string1) <если string = string1, то выполнить все следующие команды до;; >;; string2) <если string = string2, то выполнить все следующие команды до;; >;; string3)... и т.д.... esac
Пример: Пусть процедура имеет опцию -t, которая может быть подана как первый параметр: ................. together = no case $1 in -t) together = yes shift;; -?) echo "$0: no option $1" exit;; esac if test $together = yes then sort... fi
где? - метасимвол (если -?, т.е. "другая" опция, отличная от -t, то ошибка). Можно употреблять все метасимволы языка Shell, включая?, *, [-]. Легко добавить (в примере) другие опции, просто расширяя case.
|
||
|
Последнее изменение этой страницы: 2016-08-16; просмотров: 794; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.156 (0.006 с.) |