UNIX — универсальная среда программирования - Керниган Брайан Уилсон Страница 59
- Категория: Компьютеры и Интернет / Интернет
- Автор: Керниган Брайан Уилсон
- Страниц: 187
- Добавлено: 2020-09-17 00:34:49
UNIX — универсальная среда программирования - Керниган Брайан Уилсон краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «UNIX — универсальная среда программирования - Керниган Брайан Уилсон» бесплатно полную версию:UNIX — универсальная среда программирования - Керниган Брайан Уилсон читать онлайн бесплатно
1) m=$l; set `date`; y=$6 ;; #1 arg: use this year
*) m=$1; y=$2 ;; #2 args: month and year
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) ;; # numeric month
*) y=$m; m="" ;; # plain year
esac
/usr/bin/cal $m $y # run the real one
$
В первом операторе case проверяется число аргументов $# и выбирается подходящее действие. Последний шаблон в этом операторе задает вариант, выбираемый по умолчанию; если число аргументов не 0 и не 1, будет выполнен последний вариант. (Поскольку шаблоны просматриваются по порядку, вариант по умолчанию должен быть последним.) При наличии двух аргументов m и y принимают значение месяца и года, и наша команда cal должна выполняться как исходная команда.
Первый оператор case включает пару нетривиальных строк, содержащих
set `date`
Хотя это сразу и не очевидно, легко установить действие команды, запустив ее:
$ date
Sat Oct 1 06:05:18 EDT 1983
$ set `date`
$ echo $1
Sat
$ echo $4
06:05:20
$
Итак, мы имеем дело с встроенной командой интерпретатора, возможности которой многообразны. При отсутствии аргументов она выдает, как указывалось в гл. 3, значения переменных окружения. В случае обычных аргументов переопределяются значения $1, $2 и т.д. Поэтому set `date` присваивает $1 — день недели, $2 — название месяца и т.д. Таким образом, при отсутствии аргументов в первом case месяц и год устанавливаются из текущей даты. Если был задан один аргумент, он используется в качестве месяца, а год берется из текущей даты.
Команда set имеет также несколько флагов, из которых наиболее часто используются флаги -v и -х — для отключения эха команд при обработке их интерпретатором. Такое отключение может оказаться необходимым в процессе отладки сложных программ на языке shell.
Теперь осталось только перевести значение месяца, если оно представлено в строковом виде, в число. Это делается с помощью второго оператора case, который практически очевиден. Единственный нюанс состоит в том, что символ | в шаблонах оператора case, как и в команде egrep, означает альтернативу: малый|большой соответствует варианту "малый" или "большой". Конечно, эти варианты можно было бы задать с помощью [jJ]an* и т.д. Программа допускает задание месяца строчными буквами, поскольку большинство команд работает с входным потоком, где данные записаны строчными буквами (иногда первая буква — прописная), поскольку так выглядит вывод команды date. Правила сопоставления шаблонов приведены в табл. 5.2.
* Задает любую строку, включая пустую ? Задает любой одиночный символ [ccc] Задает любой из символов в ccc [a-d0-3] эквивалентно [abcd0123] "..." Задает в точности ...; кавычки защищают от специальных символов. Аналогично действует '...' \c Задает с буквально a|b Только для выражений выбора; задает а или b / Для имен файлов; соответствует только символу / в выражении; для выражений выбора сопоставляется, как любой другой символ . Если это первый символ в имени файла, то сопоставляется только с явно заданной точкой в выраженииТаблица 5.2: Правила сопоставления шаблонов в интерпретаторе
Два последних варианта второго оператора case относятся к случаю, когда единственный аргумент может быть годом; напомним, что в первом операторе case предполагалось, что аргументом является месяц. Если это число, которым может быть задан месяц, то ничего не происходит (иначе предполагается, что задан год).
Наконец, в последней строке вызывается /usr/bin/cal (настоящая команда cal) с преобразованными аргументами. Наша версия команды cal работает так, как этого мог бы ожидать начинающий:
$ date
Sat Oct 1 06:09:55 EDT 1983
$ cal
October 1983
Жалоба
Напишите нам, и мы в срочном порядке примем меры.