Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#4| Adjudicator & Tower Knight
Demon's Souls |#3| Cave & Armor Spider
Demon's Souls |#2| First Boss
SCP-077: Rot skull

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Сэйдж Рас Весь текст 822.4 Kb

Приемы профессиональной работы в Unix

Предыдущая страница Следующая страница
1 ... 36 37 38 39 40 41 42  43 44 45 46 47 48 49 ... 71
дня.  Мы используем их для сообщения своих планов, отдачи распоряжений
и для многих других целей.  Немного поразмышляем. Если почти на каждом
рабочем месте в США установлен телефон,  то телефонных номеров миллио-
ны. Каким образом вы храните все ваши телефонные номера?
     Нам необходима очередная база данных.  Эта база данных должна уп-
равлять вводом данных, их извлечением, модификацией и удалением. У нас
теперь  есть  опыт в реализации программ,  управляемых с помощью меню,
поэтому имеет смысл использовать меню и здесь.

     ЧТО ДЕЛАЕТ phone?

     Phone - это универсальная утилита для использования и  управления
базой данных телефонных номеров.  Полностью управляемая при помощи ме-
ню,  phone содержит все необходимые функции,  связанные с  управлением
базой данных: добавление, удаление, просмотр, редактирование и поиск.
     Файл, представляющий собой базу данных,  размещен в вашем регист-
рационном каталоге.  Это файл $HOME/.phone.list.  Phone использует ваш
регистрационный каталог,  так что один и тот же исполняемый модуль ра-
ботает  для любого пользователя.  Независимо от того,  где размещается
командный файл phone или кто и откуда его запустил в вашей системе, вы
всегда получите именно ваш файл телефонных номеров, поскольку он подк-
лючен к вашему регистрационному каталогу посредством встроенной  пере-
менной shell с именем HOME.
     Имеется всего одно главное меню.  Оно выводится на экран, и внизу
появляется  приглашение.  Большинство вариантов выбора запрашивают до-
полнительную информацию. Меню выглядит так:

---------------------------------------------------------------------------

|
|
|  phonebase = /usr/russ/.phone.list
|
|         PHONE MENU
|         ----------
|    add name to list         (добавить имя к списку)
|    delete name from list    (удалить имя из списка)
|    edit list                (редактировать список)
|    search for name in list  (поиск имени в списке)
|    view complete list       (просмотр списка)
|     - exit program      (выход из программы)
|
|  Press a,d,e,s,v or :
|

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

     ПРИМЕРЫ

1. $ phone
   a
   russ sage
   unix master
   123-4567

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

2.  $ phone
    V

     Просмотр всех записей в вашей базе данных.

     ПОЯСНЕНИЯ

     Строки 4-8  выполняют некоторую проверку на наличие ошибок.  Если
вы вызвали phone с какими-либо  аргументами,  выводится  сообщение  об
ошибке и программа завершается. Поскольку phone управляется при помощи
меню, она не использует аргументы.
     Строка 10  инициализирует переменную BASE именем файла телефонной
базы данных.  Это назначение выполняется с помощью переменной HOME для
получения вашего регистрационного каталога.
     Строки 12-69 представляют собой  один  большой  бесконечный  цикл
while.  Вся эта структура подобна структуре других программ, управляе-
мых с помощью меню, которые мы рассмотрели. Само меню выводится опера-
тором  echo.  Текст  меню НЕ выделен отступами подобно остальной части
программы,  поскольку оператор echo воспринимает этот текст как  лите-
ральные данные, включая пробелы.
     Строка 28 читает ответ пользователя,  а строки 30-68 представляют
собой оператор case, который проверяет значение ответа. Если был нуле-
вой ввод, программа завершается.
     Если была  введена  буква  a,  выбирается  опция  добавления.  (В
действительности каждая опция проверяется и на верхнем,  и  на  нижнем
регистре для обеспечения гибкости).  Текст программы,  соответствующий
добавлению, запрашивает имя, описание и номер телефона. Если вы оказа-
лись в опции добавления случайно, используйте возможность возврата пу-
тем нажатия возврата каретки в ответ на запрос имени. Однако после то-
го,  как вы ввели имя,  выйти уже нельзя. Вам необходимо в этом случае
поместить в базу фиктивную запись или нажать клавишу аварийного завер-
шения для выхода из программы вообще. Описание может быть произвольной
длины, однако оно не смотрится, если очень длинное. После того как все
поля введены,  вся строка помещается в конец базы данных. Отметим, что
добавляются символы табуляции для разбиения записи на поля. После это-
го  база  данных  пересортировывается,  чтобы новая запись заняла свое
место в алфавитном порядке.
     Если была введена буква d,  то она распознается в строке 45. Зап-
рашивается удаляемое имя. Если вводится только возврат каретки, опера-
тор  continue  возвращает  нас  обратно в цикл while и снова выводится
главное меню.  Для удаления записи использована команда  sed,  поэтому
вводимое  имя  должно указываться точно в таком же виде,  как оно хра-
нится в файле.  Результат удаления помещается во временный файл, кото-
рый  затем  в строке 51 переименовывается в исходный файл базы данных.
Одной из модификаций может быть показ пользователю того,  что он соби-
рается удалять,  и запрос подтверждения.  Если подтверждение получено,
то данные удаляются окончательно.  Сейчас сделано так, что вы на самом
деле  не  знаете,  что именно собираетесь удалять.  Поэтому необходимо
точно указывать удаляемое имя.  Здесь выбран относительно быстрый и не
совсем  честный  подход.  А  вообще  вы даже могли бы использовать не-
посредственно редактор vi для поиска и удаления.
     Опция редактирования в строке 53 выполняет только одно - вызывает
редактор vi для работы с базой телефонных номеров.  Используя редактор
vi,  вы можете вручную сделать файл базы данных таким,  как вам нужно.
Зачастую формат входных данных "плывет" из-за разной длины. Все данные
хранятся  в  свободном  формате  и поэтому их можно как угодно смещать
вдоль строки.
     Когда вы редактируете ваш файл редактором vi, все его команды ак-
тивны.  Действует даже выход в shell и выполнение обычных  действий  с
системой.  Поэтому не забудьте прекратить работу этого shell'а,  иначе
вы будете весьма удивлены в конце рабочего дня при выходе из  системы.
Для выхода из редактора и возврата к утилите phone используйте обычные
методы, такие как ZZ, :x и :wq.
     Опция поиска  в строке 55 запрашивает имя,  которое нужно искать,
читает это имя,  выводит декоративные элементы до  и  после  данных  и
использует утилиту grep для нахождения требуемой записи.  Утилита grep
в строке 58 использует команду -y, вызывающую нечувствительность к ре-
гистру. Это означает, что вы можете производить ввод искомого элемента
как на верхнем,  так и на нижнем регистре.  Если не найдено ничего, то
ничего и не выводится на экран.
     Опция просмотра начинается со строки 61.  Сначала выводится заго-
ловок в фоновом режиме.  Это делается для быстроты.  На самом деле это
просто эксперимент для того, чтобы увидеть, будут ли асинхронные собы-
тия  производить вывод на экран синхронно.  В данном случае это именно
так. Файл выводится командой more. Пока утилита more постранично выво-
дит файл, все ее команды нам доступны. (Наш командный файл m в главе 4
иллюстрирует, что мы можем делать с помощью more.)
     В строке 63 выводится сообщение пользователю о том, что он должен
нажать возврат каретки. Строка 64 выполняет чтение. Эта последователь-
ность  придерживает  распечатанный  файл  данных на экране,  чтобы его
строки не пропали при сдвиге вверх.  Если бы этих операторов не  было,
напечаталось  бы  главное  меню и мы потеряли бы то,  что находилось в
верхней части экрана.
     Строка 66 выполняет проверку на ошибки для меню в целом.  Если вы
ввели данные,  которые не соответствуют ни одному из предыдущих шабло-
нов, то им сопоставляется шаблон *. В этом случае печатается сообщение
об ошибке,  управление переходит из оператора case в конец цикла while
и при следующей итерации этого цикла снова печатается главное меню.

---------------------------------------------------------------------------

     ИМЯ:  office
---------------------------------------------------------------------------

office     Делопроизводитель

     НАЗНАЧЕНИЕ

     Обеспечивает простой доступ ко многим утилитам управления  делоп-
роизводством, которые мы уже рассмотрели.

     ФОРМАТ ВЫЗОВА

office

     ПРИМЕР ВЫЗОВА

office    Проверяет мой почтовый ящик и сообщает, пуст ли он
m

     ТЕКСТ ПРОГРАММЫ office

1   :
2   # @(#) office v1.0  Office Manager  Author: Russ Sage
2а                        Делопроизводитель

4   if [ $# -gt 0 ]
5     then  echo "office: argument error" >&2
6           echo "usage: office"          >&2
7           exit 1
8   fi

10  while :
11  do
12          c
13          set `date`
14          echo "
15  $1, $2 $3             $4

17         Office Menu
18         -----------
19          Mail
20          News
21          Calendar
22          Phone
23          Automatic Reminders
24          Shell Command
25           to exit

27  press m,n,c,p,a,s or  : \c"

29          read CMD

31          case $CMD in
32          "")     exit;;
33          m|M)    if [ -s /usr/spool/mail/$LOGNAME ]
34                    then  echo
35                          ll /usr/spool/mail/$LOGNAME
36                          echo "\nWould yuo like to see it (
y/n): \c"
37                          read CMD
38                          if [ "$CMD" = "y" ]
39                            then echo
40                                 mail
41                          fi
42                   else echo  "\nNo mail today"
43                   fi
44                   echo "\nhit \c"
45                   read CMD;;
46          n|N)     PWD=`pwd`
47                   cd /usr/news
48                   echo "\nThe following files are news item
in /usr/news:\n"
49                   lc
50                   echo "\nEnter filename or  to exit: \c"
51                   read NAME
52                   while [ "$NAME" != "" ]
53                   do
54                           if [ -s $NAME ]
55                            then echo "\n-------------------"
56                                 cat $NAME
57                                 echo "---------------------"
58                            else echo "$NAME is not a news
file"
59                           fi
60                           echo "\nEnter filename or  to
exit: \c"
61                           read NAME
62                   done
63                   cd $PWD;;
64          c|C)     echo "\n"
65                   today
66                   if [ -s $HOME/calendar ]
67                     then echo "Calendar file:\n`ll $HOME/
calendar`"
68                          echo "\nCalendar notifications:"
69                          PWD=`pwd`
70                          cd $HOME
71                          calendar
72                          cd $PWD
73                          echo "\nCheck your mail for calendar
notifications"
74                     else echo "\nYou do not have a calendar
file at $HOME"
75                   fi
76                   echo "\nhit \c"
77                   read CMD;;
78          p|P)     phone;;
79          a|A)     greet
80                   $HB/at 11:45 echo ^GLunch in 15 minutes
81                   $HB/at 16:45 echo ^GShift change in 15
minutes

83                   echo "\nYou will receive notices at 11:45
& 4:45"
84                   echo "\nWould you like to leave some
reminders (y/n): \c"
85                   read CMD
86                   if [ "$CMD" = "y" ]
87                     then echo "\nThe syntax is: at HR:MN
executable_phrase"
88                          echo "The time now : `date '+%T'`"
Предыдущая страница Следующая страница
1 ... 36 37 38 39 40 41 42  43 44 45 46 47 48 49 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама