ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ SHELL



Министерство общего и профессионального образования Российской Федерации

ИНСТИТУТ ПЕРЕПОДГОТОВКИ КАДРОВ

Уральского государственного технического университета

 

 

ОПЕРАЦИОННАЯ СИСТЕМА UNIX

 

Методические указания к лабораторному практикуму по дисциплине «Сети ЭВМ и средства телекоммуникаций» для слушателей специальности 220100 «Вычислительные машины, комплексы, системы и сети»

 

 

Екатеринбург

1999


УДК 681.3

 

Составитель С.С.Ваулин, к.т.н.

Научный редактор В.П.Кулюкин

 

ОПЕРАЦИОННАЯ СИСТЕМА UNIX: Методические указания к лабораторному практикуму по дисциплине «Сети ЭВМ и средства телекоммуникаций» / С.С.Ваулин. Екатеринбург: изд. ИПК УГТУ, 1999. 28с.

 

В работе описываются особенности операционной системы UNIX и ее программного интерфейса, знание которых необходимо для выполнения первой части лабораторного практикума.

 

Библиогр.: 8 назв. Табл. 10.

 

Подготовлены кафедрой микропроцессорной техники

 

© Институт переподготовки кадров Уральского государственного технического университета, 1999

ВВЕДЕНИЕ

Среди современных операционных систем (ОС) особое место занимает Unix. Это семейство многозадачных и многопользовательских систем, которое обеспечивает современный пользовательский интерфейс на базе стандарта X Window и имеет беспрецедентные сетевые возможности на базе протокола TCP/IP. Unix может работать практически на всех существующих платформах и является стандартом де факто открытых и мобильных операционных систем (название UNIX запатентовано компанией AT&T, поэтому подобные ОС называются по-разному: SCO UNIX, BSDI, Solaris, Linux, AIX и т.д.).

ОС Unix была создана в 1969-70гг. Кеном Томпсоном и Деннисом Ритчи в Bell Laborotories (AT&T). Широко распространяться Unix начала в 79-80-м годах. Вручение создателям Unix в 1983 году Международной премии А.Тьюринга в области программирования ознаменовало признание этой системы мировой научной (computer science) общественностью, что также беспрецедентно. На основе программного интерфейса UNIX разработан стандарт POSIX, с которым совместимы все перспективные существующие и разрабатываемые ОС, включая системы реального времени и ОС современных майнфреймов и супер-ЭВМ. На этой же основе разработаны стандарты открытых систем группы X/OPEN.

Такие успехи системы UNIX обусловлены рядом ее особенностей:

Ядро ОС написано на языке С, что позволяет переносить ее на другие аппаратные платформы. Для компьютеров с уникальной архитектурой, выпускающихся малыми сериями, UNIX – практически единственно возможная ОС, позволяющая использовать стандартное программное обеспечение.

ОС имеет весьма совершенную файловую систему, обеспечивающую достаточную защиту информации и прозрачный доступ к разнообразной периферии. ОС может поддерживать одновременно несколько файловых систем.

Командный язык ОС включает в себя средства, присущие процедурным языкам программирования. На нем, в частности, написана часть утилит системы. Более того, ОС может одновременно поддерживать несколько интерпретаторов команд со своими командными языками.

В состав ОС вскоре после их разработки были включены средства сетевого взаимодействия с использованием полного стека протоколов TCP/IP и всех сетевых сервисов, доступных в сети INTERNET. В настоящее время UNIX представляет собой наиболее развитую сетевую операционную систему. Серверы крупных корпоративных сетей работают практически исключительно под управлением различных ОС семейства UNIX.

Процессы, запускаемые в системе, могут взаимодействовать между собой как с помощью классических средств межпроцессных коммуникаций (IPC), так и с помощью средств IPC (интерфейсы сокетов и TLI), обеспечивающих межмашинное взаимодействие в рамках архитектуры «клиент-сервер». Интерфейс сокетов, в частности, реализован на большом количестве аппаратно-программных платформ и стал фактическим стандартом интерфейса для работы в сети.

Возможна организация распределенных по сети вычислений (интерфейсы RPC либо NCS).

ОС имеет стандартизованый графический пользовательский интерфейс X Window, изначально предназначенный для использования в распределенных по сети программах.

Лабораторный практикум по тематике данного пособия предусматривает выполнение четырех лабораторных работ, каждая из которых рассчитана на 4 часа. В процессе их выполнения слушатели получают навыки, достаточные для самостоятельной работы в системе UNIX. Последующие работы посвящены сетевым возможностям ОС UNIX, ее администрированию и приемам программирования распределенных программных систем в рамках архитектуры «клиент-сервер».

ФАЙЛОВАЯ СИСТЕМА UNIX

Файловая система организует хранение и обработку файлов – поименованных областей данных на внешних носителях. Файлы по каким-либо признакам объединяются в каталоги. Каталог, в свою очередь, может быть зарегистрирован в каталоге вышестоящего уровня. Файловая система UNIX является иерархической и организована в виде дерева с вершиной, которая называется корневым каталогом (корнем).

Имена файлов могут содержать любые символы, за исключением пробела, управляющих символов и символов, имеющих специальное значение для командной оболочки системы:

! @ # $ % ^ & * ( ) [ ] { } ’ \ / | ; ? ” < >

Имя файла, в частности, может содержать любое количество точек, например:

libXIE.so.6.0

Строчные и прописные буквы в именах файлов различаются. Максимальная длина имени файла определяется значением системной переменной NAME_MAX, описанной в файле заголовков limits.h. Обычное ее значение для современных версий UNIX – 255 символов. Ранние версии обычно ограничивали длину имени файла 14 символами. Системные переменные используются при генерации ядра операционной системы, в процессе которой создается новое ядро с обычно отличающейся конфигурацией, заменяющее существующее.

Файл полностью идентифицируется указанием пути к нему – последовательности каталогов, начиная от корневого. Отдельные каталоги в пути отделяются символом «/», например:

/usr/local/samba/config/smb.conf

Помимо такого абсолютного имени файла можно использовать и относительное, когда путь задается относительно некоторого каталога, являющегося текущим. Получить имя текущего каталога можно с помощью команды pwd, а изменить – командой cd, например:

cd /root

В результате выполнения команды текущим каталогом будет каталог /root.

Все каталоги, кроме корневого, содержат по крайней мере два входа, обозначающие:

.             - текущий каталог;

..            - родительский каталог.

 

Эти имена можно использовать при задании пути к файлу:

../lib/libXIE.so.6.0

./main_program

Каждый файл может иметь несколько имен (жестких связей), которые совершенно равноправны и могут быть зарегистрированы в различных каталогах. Связи файла устанавливаются командой ln.

ОС UNIX поддерживает следующие типы файлов:

Обычные файлы. Используются для хранения данных.

Каталоги. Содержат списки файлов.

Специальные байтоориентированные файлы. Используются в качестве канала для доступа к периферийным устройствам, обмен с которыми производится последовательно, побайтно. Буферизация ввода-вывода отсутствует.

Специальные блокоориентированные файлы. Используются в качестве канала для доступа к периферийным устройствам, обмен с которыми производится поблочно. В частности, это дисковые накопители. Обычно применяют блоки размером 1024 байта, а обмен с устройствами производится фрагментами длиной, кратной размеру блока. В обязательном порядке используется кэширование по чтению и записи.

Специальные FIFO-файлы (коммуникационные файлы, поименованные программные каналы). Представляют собой очереди в адресном пространстве ядра ОС, через которые могут обмениваться данными процессы, не являющиеся родственниками.

Специальные сокет-файлы. Представляют собой очереди в адресном пространстве ядра ОС, через которые могут обмениваться данными процессы, использующие интерфейс сокетов в области AF_UNIX (внутри одной системы UNIX).

Символические ссылки. Файлы, содержащие пути к другим файлам и косвенно адресующие их (мягкие связи, устанавливаемые командой ln -s).

Поскольку UNIX является многопользовательской системой, права доступа к файлам регламентируются и проверяются при каждом обращении к ним. Выделяют три типа операций над файлами: чтение, запись, выполнение. Для каталога право на выполнение означает право на поиск в каталоге. Все операции с каталогами производятся только операционной системой.

Права на доступ к файлу регламентируются для следующих категорий пользователей:

владелец файла;

член группы владельца файла;

все остальные пользователи;

Соответственно файл принадлежит своему владельцу и одной из групп, в которую он входит. Полную информацию о правах доступа к файлам в каталоге можно получить командой ls, например:

ls –l /usr/dict

Структура полученной информации следующая.

1      2 3 4  5 6 7  8

total 408

-rw-r--r-- 1 root root 2945 Nov 19 1996 extra.words

-rw-r--r-- 1 root root  409048 Nov 19 1996 linux.words

drwxr-xr-x 2 root root 1024 Nov 17 14:23 new_dict

-rw-r--r-- 1 root root 10 Nov 3 01:23 out.prn

lrwxrwxrwx 1 root root 11 Oct 7 21:38 words -> linux.words

Содержание колонок листинга:

Права доступа к файлу.

Число связей файла.

Владелец файла.

Группа владельца файла.

Длина файла в байтах.

Дата создания файла.

Время либо год создания файла.

Имя файла (для символической ссылки указывается также ее содержание).

Поле прав доступа к файлу структурировано следующим образом:

- r w - r - - r - -
Тип файла

Права владельца

Права группы

Права остальных

Обозначение прав доступа:

r             - право чтения;

w           - право записи;

x            - право выполнения.

Для каталога право выполнения означает право на поиск в каталоге. Если какое-либо право отсутствует (операция запрещена), в соответствующей позиции поля прав появляется символ «-».

 

Обозначение типов файла:

-       - обычный файл;

d      - каталог;

l        - символическая ссылка;

b      - блокоориентированный специальный файл;

c      - байториентированный специальный файл;

p      - специальный FIFO файл ( поименованный программный канал);

s      - специальный файл типа сокет.

Изменение прав доступа производится командой chmod, изменение владельца и группы – chown и chgrp.

Кроме прав доступа, у файлов имеются дополнительные атрибуты, которые мы рассмотрим позже.

Синтаксис команды chmod:

chmod <класс доступа><операция><право доступа> <список файлов>

Классы доступа:

u  - владелец;

g  - группа владельца;

    o   - остальные пользователи (кроме владельца и его группы);

a  - все пользователи.

Операции:

+  - добавить право;

-   - удалить право;

=  - присвоить право;

Например, добавить право чтения всех файлов в текущем каталоге для всех пользователей:

chmod a+r *

Синтаксис команд изменения владельца и группы:

chown <владелец> <список файлов>

chgrp <группа> <список файлов>

Например, изменение идентификатора владельца всех файлов текущего каталог на user:

chown user *

Изменить эти идентификаторы файла может либо владелец файла, либо привилегированный пользователь.

На каждом устройстве (физическом носителе) создается своя файловая система. Корневой каталог находится на устройстве, с которого была загружена операционная система. Файловые системы других устройств становятся доступными после выполнения операции монтирования (например, командой mount). Операция монтирования предполагает присоединение корневого каталога файловой системы на устройстве к основному дереву каталогов в точке монтирования – некоторому каталогу. Содержимое этого каталога становится временно недоступным, вместо него доступно содержимое корневого каталога на устройстве. Обратная операция – демонтирование (например, командой umount) - должна быть выполнена, в частности, перед сменой носителя на устройстве.

Синтаксис команды монтирования:

mount <устройство> <точка монтирования>

Устройство представляется специальным файлом, связанным с этим устройством. Например, монтирование в каталог /mnt:

mount /dev/fd0 /mnt

Демонтирование производится следующей командой:

umount <устройство>

Например, демонтирование дискетты:

umount /dev/fd0

Команды монтирования и демонтирования обычно доступны только привилегированному пользователю.

Суперблоки всех смонтированных файловых систем, содержащие основную информацию о них, кэшируются. Соответственно, смена носителя без успешного выполнения демонтирования (если устройство допускает такую смену), может привести к разрушению файловой системы на этом носителе. К аналогичному результату может привести и выключение питания компьютера без остановки операционной системы (командами halt либо rebout). Для уменьшения вероятности такого разрушения периодически выполняется системный вызов sync, приводящий суперблоки всех смонтированных файловых систем в актуальное состояние и сбрасывающий на устройства все буферы. Возможно также выполнение команды sync вручную.

ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ SHELL

Простейшие средства shell

Командный язык ОС UNIX shell фактически представляет собой интерпретируемый язык программирования высокого уровня. На этом языке пользователь осуществляет управление системой. Интерпретатор команд shell (команда sh) - это одна из многих утилит UNIX. Он не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках стандарта POSIX 1003.2.) – имеются интерпретаторы команд и, соответственно, языки cshell, kshell, bash (наиболее популярный в последнее время) и другие. Более того, пользователь может разработать и использовать свой собственный интерпретатор.

Первоначально интерпретатор команд вызывается автоматически в интерактивном режиме при регистрации в системе и выдает на экран свое приглашение. После этого можно выполнять любые команды, в том числе и сам shell, который создаст при этом новую оболочку внутри прежней. Интерпретатор команд запускается также при выполнении любого командного файла (сценария, программы на языке shell) – выполнимого текстового файла, содержащего команды shell.

Элементы языка shell

Элементарной конструкцией языка shell является простая команда. Команды в shell состоят из отдельных слов, разделенных промежутками (пробелами и символами табуляции) и обычно имеют следующий формат:

<имя команды> <опции> <аргумент(ы)>

Опции обычно отличаются тем, что начинаются со знака «минус».

Например:

ls -l /usr/bin

Эта команда выдает оглавление каталога /usr/bin в длинном формате.

Комментарии начинаются с символа «#» и заканчиваются переводом строки.

Командная строка, не содержащая комментария, может быть продолжена с помощью символа «\» в конце строки.

Для отмены специального значения некоторых символов употребляется экранирование. Оно может применяться для сохранения непосредственного значения специальных символов и запрещения распознавания зарезервированных слов. Возможны следующие механизмы:

Обратная дробная черта «\». Экранирует одиночный символ.

Апостроф «’». Экранируется строка, заключенная в апострофы.

Кавычки «”». Экранируется строка, заключенная в апострофы. Сохраняется специальное значение следующих символов: «$», «‘», «\».

Параметры

Параметром называется некоторый объект, имеющий значение. Параметры могут обозначаться именем, номером или специальными символами.

Командный язык допускает следующие типы параметров:

Командные переменные. Обозначаются именем.

Позиционные параметры. Обозначаются номером.

Специальные параметры. Обозначаются специальными символами.

Командные переменные вводятся операциями присваивания:

<имя>=<значение>

Операция присваивает переменной с указанным именем последовательность символов, заданную значением (возможно, пустым). Пробелы при записи присваивания недопустимы.

Для того, чтобы переменные могли использоваться в вызываемых shell командах, их необходимо включить в среду этих команд. Включение переменных в среду всех вызываемых впоследствии команд производится встроенной командой export:

export [<имя>[=<значение>]...]

Например, включение в среду переменной EDITOR:

export EDITOR=/usr/bin/joe

Позиционные параметры обозначаются десятичными цифрами. Параметр с номером 0 обозначает имя команды (интерпретируемого командного файла). Параметры с номерами 1 и более последовательно обозначают аргументы команды. Позиционные параметры получают значения при запуске shell и могут изменяться командой set. При подстановке параметров с номерами из двух и более цифр этот номер заключается в фигурные скобки.

Специальными параметрами, например, являются:

# - число позиционных параметров (с единицы), которым присвоено значение;

? - код завершения (число) последней выполненной команды;

$ - идентификатор процесса, выполняющего shell.

*   - Последовательность значений всех позиционных параметров, начиная с первого. При подстановке внутри строки в кавычках последовательность рассматривается как один операнд.

@ - Последовательность значений всех позиционных параметров, начиная с первого. При подстановке внутри строки в кавычках последовательность рассматривается как множество операндов. Число операндов равно числу параметров.

Интерпретация слов

При обработке командной строки shell последовательно выполняет вычисления, связанные с интерпретацией слов. Порядок вычислений следующий:

Подстановка значений псевдонимов. Слово, совпадающее с именем псевдонима, заменяется его значением.

Подстановка значений параметров. Подстановка выполняется, когда параметру предшествует символ «$». Для отделения имени параметра от последующих символов, а также, если номер позиционного параметра состоит из нескольких цифр, используются фигурные скобки: ${<имя>}. Возможны также условные подстановки.

Подстановка вывода команд. Конструкция $(<команда>) заменяется стандартным выводом этой команды.

Интерпретация промежутков. Полученная командная строка просматривается в поисках промежутков и разделяется ими на различные аргументы. Неявные пустые аргументы, получившиеся как результат подстановки пустых значений параметров, удаляются. Промежутком служит любой символ, встречающийся в значении системной переменной IFS (по умолчанию – пробел, табуляция и перевод строки).

Подстановка имен файлов. Каждое слово командной строки анализируется на наличие в нем метасимволов. Если хотя бы один метасимвол найден, слово считается шаблоном, и заменяется лексикографически упорядоченной последовательностью найденных имен файлов, разделенных пробелами. Метасимволы соответствуют:

*     -    любой последовательности символов;

?    -    любому одиночному символу;

[...] -       любому одиночному символу либо диапазону, указанному в скобках.

Например,

cat *.?

выдаст все файлы текущего каталога с однобуквенными суффиксами.

Удаление экранирующих символов.

После проведения этих подстановок получается последовательность команд, которая выполняется. Перед выполнением команды ее ввод и вывод могут быть перенаправлены на конкретные файлы.

Группировка команд

Простые команды для выполнения могут быть сгруппированы.

Последовательность команд, соединенных управляющей операцией «|», образуют конвейер. Стандартный вывод каждой команды конвейера, кроме последней, направляется в стандартный ввод следующей команды. Команды конвейера исполняются асинхронными процессами и связаны через программные каналы. Конвейер используется для выполнения сложных операций путем их разделения на ряд простых. Например, для подсчета числа файлов в каталоге может быть использован конвейер:

ls –l | wc -l

Один или несколько конвейеров, соединенных управляющими операциями «;», «&», «&&», «||», образуют список команд. Список может также завершаться операциями «;» и «&». Соединение команд (конвейеров) этими символами имеет следующий смысл:

;   - последовательное выполнение (аналог перевода строки).

& - асинхронное выполнение. Конвейеры выполняются асинхронными процессами, и интерпретатор команд не ожидает их завершения.

&& - конвейер, стоящий после «&&», выполняется только в том случае, если конвейер, стоящий до «&&», выработал нулевое значение.

|| - конвейер, стоящий после «||», выполняется только в том случае, если конвейер, стоящий до «||», выработал ненулевое значение.

Например, команда

   grep “^$autor” $fil > /dev/null || echo “$autor не найден”

производит поиск строки, заданной переменной autor в файле, заданном переменной fil. Если поиск безуспешный, то выдается сообщение об этом.

Составные команды образуются с помощью следующих конструкций.

(<список команд>)

Список команд выполняется с помощью запуска порожденного процесса интерпретатора. Любые изменения среды (параметров) порожденного процесса не отражаются на порождающем процессе.

{<список команд>;}

Список команд выполняется в текущем процессе интерпретатора.

Операторы языка shell

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

Такая проверка производится встроенной командой проверки условия test:

test <условие>

либо (с использованием псевдонимов):

[ <условие> ]

Оператор использует различные условия, объединяемые типовыми логическими операциями:

!    - (not) инвертирует значение кода завершения;

-o - (or) логическое "ИЛИ";

-a - (and) логическое "И".

Условия проверки файлов:

-f file - файл "file" является обычным файлом;

-d file - файл "file" - каталог;

-с file - файл "file" - специальный файл;

-r file - имеется разрешение на чтение файла "file";

-w file - имеется разрешение на запись в файл "file";

-s file - файл "file" не пустой.

Например, простейшая проверка существования файла с именем "specific":

[ -f specific ] ; echo $?

Условия проверки строк:

str1 = str2  - строки "str1" и "str2" совпадают;

str1 != str2  - строки "str1" и "str2" не совпадают;

-n str1              - строка "str1" непустая;

-z str1              - строка "str1" пустая.

Например, выполнение данного списка команд даст в результате «0»:

x="who is who"; export x; [ "who is who" = "$x" ]; echo $?

Условия сравнения целых чисел:

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".

В данном случае команда «test» воспринимает строки символов как целые числа. Если, к примеру, надо обнулить переменную «x», то это достигается присваиванием «x=0». Следующий список команд даст в результате выполнения «0»:

x=321 ; export x ; [ 123 -lt "$x" ] ; echo $?

Условный оператор if в общем случае имеет следующую структуру:

if <условие>

then <список команд>

[ elif <условие>

then <список команд> ]

[ else <список команд> ]

fi

Здесь "elif" представляет собой сокращение от "else if". Условие представляет собой список команд, код завершения которого анализируется и в зависимости от которого выполняется тот или иной список команд. Обычно используется оператор test.

Например, пусть в файле if-1 записан следующий текст:

If [ $1 -gt $2 ]

      then pwd

      else echo ${0}: Hello!

fi

Тогда выполнение команды:

if-1  12  13

даст

if-1:  Hello!

Оператор выбора case имеет структуру:

case <строка> in

<шаблон>) <список команд>;;

<шаблон>) <список команд>;;

...

esac

«Строка» после интерпретации сравнивается с «шаблоном». Затем выполняется «список команд» строки, где было достигнуто совпадение. Пример такого оператора:

echo -n " Какую оценку Вы получили на экзамене?: "

read z

case $z in

5) echo Молодец!;;

4) echo Все равно молодец!;;

3) echo Плохо!;;

2) echo Очень плохо!;;

*) echo ......................! ;;

esac

Структуру «case» можно использовать для реализации, в частности, простейших меню.

Оператор цикла с перечислением for имеет структуру:

for  <имя переменной>  [ in  <список значений> ]

do

     <список команд>

done

Переменная последовательно принимает значения из списка. Для каждого значения выполняется указанный список команд. Отсутствие конструкции «in» эквивалентно записи «in “@”» (список представляет собой последовательность позиционных параметров).

Пусть proc-sort представляет собой командный файл

cat $1 | sort | tee ${1}_sorted

т.е. сортируется указанный файл, результат сортировки выводится на экран и направляется в файл, к именам которых добавляется «_sorted ».

Можно записать более универсальную команду lsort, сортирующую произвольное число файлов, передаваемых параметрами:

for i

do

      proc-sort $i

done

Например, для сортировки файлов с именами f1, f2 и f3 можно ввести:

lsort f1 f2 f3

Более сложный пример рекурсивной распечатки списков подкаталогов приведен ниже.

Листинг dir.sh

spwd=$(pwd)

cd  $1

tpwd=$1

set  *

echo  "Подкаталоги каталога  $(pwd)"

for  i

do

      if  [  -d  $i  ]

                then  echo  $i

                ~/dir.sh  $i

                echo  "Конец подкаталогов"

      fi

done

cd  $spwd

Данная программа рекурсивная, она вызывает сама себя (из домашнего каталога пользователя, обозначаемого тильдой), как только встретится каталог, для поиска в нем подкаталогов. С помощью команды set позиционным параметрам присваиваются имена всех файлов из текущего каталога, затем производится поиск среди них каталогов.

Оператор цикла c условием while имеет структуру:

while <условие>

do

      <список команд>

done

Производится проверка условия. Список команд в теле цикла (между «do» и «done») выполняется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла - нулевой), или пока выполнение цикла не будет прервано командами «break», «continue», «exit».

Разработаем, например, командный файл mprint, распечатывающий с помощью команды lpr содержимое файла в заданном количестве экземпляров:

n=0

while [  $n  -lt  $2  ]

do

     n=$(expr $n + 1)

     lpr $1

done

Операции с целочисленной арифметикой здесь реализуются с помощью команды expr. Для печати, например, 50 твердых копий файла fl можно ввести следующую строку:

mprint fl  50

Оператор цикла с инверсным условием until имеет структуру:

until <условие>

do

      <список команд>

done

Выполняется проверка условия. Список команд в теле цикла выполняется до тех пор, пока эта проверка дает ложное значение (т.е. код завершения последней команды в теле цикла - ненулевой), или пока выполнение цикла не будет прервано.

Используем такую конструкцию для разработки программы, ожидающей наступление полудня:

until  date  |  grep  12:00:

do

     sleep 30

done

Команда «date» выдает текущую дату и время. Эту информацию через конвейер получает команда «grep» и пытается найти в ней подстроку, соответствующую шаблону «12:00:». Такая попытка будет успешной после наступления полудня, после чего выполнение цикла закончится, в противном же случае будут выполняться циклы ожидания (команда sleep) длительностью по 30 секунд.

Оператор завершения break имеет формат:

break [<число>]

Оператор завершает выполнение заданного числа вложенных циклов, в которых он находится. По умолчанию завершается один цикл.

Оператор продолжения continue имеет формат:

continue [<число>]

Оператор вызывает переход к следующей итерации заданного охватывающего оператор цикла. По умолчанию переходим к следующей итерации цикла, где находится оператор continue.

Пустой оператор имеет формат

:

Не производит никаких действий и возвращает нулевое значение. Может использоваться, например, в подобных конструкциях:

echo “Enter author name:\c”

read author

if grep “^$author” /usr/stan/books >/dev/null

then

      :

else

      echo “Autor not found” >&2

      exit 1

fi

В файле /usr/stan/books ищутся строки, содержащие имя автора в начале строки. Если такие строки не найдены, выводится диагностическое сообщение, в противном случае не производится никаких действий (выполняется пустой оператор).

 

 

Еще один пример рекурсивной программы, в которой используется большинство описанных выше конструкций:

Листинг rmi.sh

cd $1

echo Directory $1

set *

for i

do

if [ -d $i ]

then

      ~/rmi.sh $i

else

      echo "Delete $(pwd)/${i}?"

      while read a || exit

      do

                case $a in

                          n*) break;;

                          "") rm $i

                                   echo "Deleted $i"

                                   break;;

                esac

      done

fi

done

Программа производит диалоговое удаление файлов в заданном параметром дереве файловой системы. Для каждого файла запрашивается разрешение на удаление. Ответ пользователя вводится с помощью команды read со следующим синтаксисом:

read <список переменных>

Команда читает слова из стандартного ввода и присваивает эти слова командным переменным из списка параметров команды. При выполнении программы нажатие клавиши «Enter» в ответ на запрос означает удаление файла, а ответ, начинающийся на «n» - его сохранение. Команда exit используется для окончания выполнения программы.

В состав языка shell входят также средства описания функций и средства обработки прерываний.


Дата добавления: 2019-02-12; просмотров: 263; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!