Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 634; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.225.55.42 (0.006 с.) |