2.    Совершенствование команды саl.

shell позволяет сделать взаимодействие между пользователем и программой более удобным. В качестве примера рассмотрим команду саl. Вы помните, как используется эта команда: саl [month] year. Однако досадно, что месяц нужно задавать числом:

саl october

Реакция программы на такую команду:

bad argument

(неверный аргумент).

К тому же команда

саl 10

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

Вы можете изменить характер взаимодействия пользователя с программой саl, не меняя самой программы.

Первый шаг разработки - определить функции усовершенствованной команды саl:

·     месяц нужно распознавать по названию;

·     при наличии двух аргументов команда должна делать то же, что делала прежняя версия, за исключением перевода названия месяца в его номер;

·     в случае одного аргумента следует печатать календарь месяца или года (в зависимости от того, что Вам требуется);

·     а при отсутствии аргументов - календарь текущего месяца, так как большей частью именно для этого и обращаются к команде.

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

shell имеет оператор case, который успешно применяется в таких ситуациях:

case слово in

шаблон) команды ;;

шаблон) команды ;;

esac

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

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

В переменной интерпретатора $# хранится число аргументов, с которыми была вызвана программа. Символ # в начале слова означает, что вся следующая за ним строка рассматривается как комментарий.

В своем личном каталоге bin с помощью редактора vi создайте файл саl, содержание которого следующее:

# cal: улучшенное взаимодействие с /usr/bin/cal

case $# in

0) set `date`; m=$2; y=$7;; # нет аргументов: использует текущие

1.    m=$1; set `date`; y=$7;; # 1 аргумент: использует текущий год

*) m=$1; y=$2;; # 2 аргумента: месяц и год

esac

case $m in

jan* | Jan*) m=1;;

feb* | Feb*) m=2;;

mar* | Mar*) m=3;;

apr* | Apr*) m=4;;

may* | May*) m=5;;

jun* | Jun*) m=6;;

jul* | Jul*) m=7;;

aug* | Aug*) m=8;;

sep* | Sep*) m=9;;

oct* | Oct*) m=10;;

nov* | Nov*) m=11;;

dec* | Dec*) m=12;;

[1-9]|10|11|12) ;; # номер месяца

*) y=$m; m=" ";; # обычный год

esac

/usr/bin/cal $m $y # запуск настоящей команды

В первом операторе case проверяется число аргументов $# и выбирается подходящее действие. Последний шаблон в этом операторе задает вариант, выбираемый по умолчанию: если число аргументов не 0 и не 1, будет выполнен последний вариант. (Поскольку шаблоны выполняются по порядку, вариант по умолчанию должен быть последним.) При наличии двух аргументов m и у принимают значения месяца и года, и новая команда должна выполняться как исходная команда.

Первый оператор case включает пару нетривиальных строк, содержащих set `date`. Хотя сразу это и не очевидно, легко установить действие команды, запустив ее. Вы помните, что команда date выводит на экран информацию о дне недели, месяце и числе, времени и годе. Для большей наглядности Вы можете сначала выполнить команду

date

а затем ввести

set `date`

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

echo $1

на эране должно появиться название текушего дня недели;

echo $4

Вы должны увидеть текущее время.

Команда set - встроенная команда интерпретатора, возможности которой многообразны. При отсутствии аргументов она выдает, как Вы помните, значения переменных среды. В случае обычных аргументов переопределяются значения $1, $2 и т.д. Поэтому set `date` присваивает $1 - день недели, $2 - название месяца и т.д. Таким образом, при отсутствии аргументов в первом операторе case месяц и год устанавливаются из текущей даты. Если задан один аргумент, он используется в качестве месяца, год берется из текущей даты.

Теперь осталось только перевести значение месяца, если оно представлено в строковом виде, в число. Это делается с помощью второго оператора case, который практически очевиден. Единственный нюанс состоит в том, что символ | в шаблонах оператора case означает альтернативу: малый | большой соответствует варианту малый или большой. Конечно, эти варианты можно было бы задать с помощью [jJ]an* и т. д.

Программа допускает задание месяца строчными буквами, поскольку большинство команд работает с входным потоком, где данные записаны строчными буквами, иногда первая буква—прописная, поскольку так выглядит вывод команды date.

Правила сопоставления шаблонов в интерпретаторе

* задает любую строку, включая пустую

? задает любой одиночный символ

[ссс] задает любой из символов в ссс [a-d0-3] эквивалентно [abcd0123]

" ... " задает в точности ...; кавычки защищают от специальных символов. Аналогично действуют '...'

\с задает с буквально (т.е. отвергает специальное значение символа)

a | b только для выражений выбора; задает а или b

Два последних варианта второго оператора case относятся к случаю, когда единственный аргумент может быть годом; напомним, что в первом операторе case предполагалось, что аргументом является месяц. Если это число, которым может быть задан месяц, то ничего не происходит (иначе предполагается, что задан год).

Наконец, в последней строке вызывается /usr/bin/cal (исходная команда
cal) с преобразованными аргументами.

Не забудьте сделать файл выполняемым.

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

Месяц должен распознаваться по названию, поэтому команды

cal oct

cal octber

обязаны выдать календарь на октябрь месяц текущего года. То же самое должна сделать команда

cal Oct

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

cal 2 1996

cal feb 1996

cal Feb 1996

обязаны выдать на экран календарь февраля месяца1996 года.

В случае одного аргумента следует печатать календарь месяца или года (в зависимости от того, что Вам требуется), поэтому команда

cal feb

должна печатать календарь февраля текущего года, а

cal 1998

- всего 1998 года.

И, наконец, при отсутствии аргументов

cal

должен быть выдан календарь текущего месяца.

Если новая версия команды cal находится в подкаталоге bin Вашего личного каталога, а он прописан первым в PATH, то, обращаясь к команде cal, Вы будете использовать новую версию команды. В каком случае при обращении к cal будет использована исходная команда? Как этого избежать? Можно ли назвать новую версию команды иначе?


Информация о работе «Практическая работа по предмету UNIX»
Раздел: Информатика, программирование
Количество знаков с пробелами: 81628
Количество таблиц: 1
Количество изображений: 0

Похожие работы

Скачать
47900
1
1

... KDE — свободная среда рабочего стола для UNIX-подобных операционных систем. Построена на основе кросс-платформенного инструментария разработки пользовательского интерфейса Qt. Работает преимущественно под UNIX-подобными операционными системами, которые используют графическую подсистему X Window System. Новое поколение технологии KDE 4 частично работает на Microsoft Windows и Mac OS X. В ...

Скачать
76498
0
7

... сокращает размер файла, но к связанным изображениям нельзя применять пиксельные эффекты. 3.         ОСОБЕННОСТИ РАЗРАБОТКИ ЭЛЕМЕНТОВ НАРУЖНОЙ РЕКЛАМЫ В ПАКЕТАХ ADOBE PHOTOSHOP Adobe Photoshop — растровый графический редактор, разработанный и распространяемый фирмой Adobe Systems. Этот продукт является лидером рынка в области коммерческих средств редактирования растровых изображений, и ...

Скачать
193894
73
12

аучного цикла является отсутствие возможности реальной постановки учебного, и лабораторного эксперимента. Хотя в настоящее время имеются разработки виртуальных лабораторных практикумов, однако окончательно решение проблемы требует пристального внимания специалистов различных профилей, в том числе и психолого-педагогического. 1.2 Роль технологии виртуальных приборов обучения в техническом вузе ...

Скачать
225728
6
0

... ориентированы на 32 разрядные шинные архитектуры компьютеров с процессорами 80386, 80486 или Pentium. Фирма Novell также подготовила варианты сетевой ОС NetWare, предназначенные для работы под управлением многозадачных, многопользовательских операционных систем OS/2 и UNIX. Версию 3.12 ОС NetWare можно приобрести для 20, 100 или 250 пользователей, а версия 4.0 имеет возможность поддержки до 1000 ...

0 комментариев


Наверх