Данная функция отсекает все, что следует за третьим символом, и преобразует первый символ в верхний регистр, а два остальных — в нижний. Такой формат соответствует стандартным сокращенным названиям дней недели и месяцев в выводе команды date, что необходимо для правильной работы сценария agenda. Остальная часть сценария addagenda не содержит ничего сложного; бо́льшую его часть занимает проверка формата введенных данных.
Наконец, в строке
, он сохраняет нормализованные данные в скрытый файл. Отношение кода, связанного с проверкой ошибок, к коду, выполняющему фактическую работу, довольно типично для хорошо написанных программ: проверка и первичная обработка входных данных позволят сделать уверенные предположения об их формате в последующих приложениях.
Сценарий agenda проверяет события, преобразуя текущую дату в три возможных строковых представления ( день недели, число+месяц и день+месяц+год )
. Затем он сравнивает каждую из этих строк с датами из записей в файле .agenda . Найденные совпадения выводятся на экран.
Самый, пожалуй, интересный прием в этой паре сценариев — использование команды eval для присваивания четырем переменным четырех значений, определяющих дату
:
eval $(date "+weekday=\"%a\" month=\"%b\" day=\"%e\" year=\"%G\"")
Можно было бы получить значения по одному (например, weekday="$(date +%a)"), но в очень редких случаях этот способ дает ошибочные результаты, если в ходе выполнения четырех вызовов date произойдет смена даты, так что краткая форма с единственным вызовом предпочтительнее. Плюс, это просто круто выглядит.
Так как date может вернуть день как число с нежелательным начальным пробелом, следующая строка
удаляет его. А теперь посмотрим, как все это работает!
Сценарий addagenda предлагает пользователю ввести дату нового события. Затем, если дата имеет допустимый формат, сценарий предлагает ввести однострочное описание события.
Сопутствующий сценарий agenda не имеет параметров и, когда вызывается, выводит список всех событий, запланированных на текущую дату.
Чтобы увидеть, как работает эта пара сценариев, добавим несколько новых событий, как показано в листинге 3.14.
Листинг 3.14.Тестирование сценария addagenda и добавление нескольких событий
$ addagenda
Agenda: The Unix Reminder Service
Date of event (day mon, day month year, or dayname): 31 October
One-line description: Halloween
$ addagenda
Agenda: The Unix Reminder Service
Date of event (day mon, day month year, or dayname): 30 March
One-line description: Penultimate day of March
$ addagenda
Agenda: The Unix Reminder Service
Date of event (day mon, day month year, or dayname): Sunday
One-line description: sleep late (hopefully)
$ addagenda
Agenda: The Unix Reminder Service
Date of event (day mon, day month year, or dayname): march 30 17
Bad date format: please specify day first, by day number
$ addagenda
Agenda: The Unix Reminder Service
Date of event (day mon, day month year, or dayname): 30 march 2017
One-line description: Check in with Steve about dinner
Теперь с помощью сценария agenda можно быстро вспомнить, что должно произойти сегодня, как показано в листинге 3.15.
Листинг 3.15.Использование сценария agenda для поиска событий на сегодня
$ agenda
On the agenda for today:
··Penultimate day of March
··sleep late (hopefully)
··Check in with Steve about dinner
Обратите внимание, что даты в совпавших событиях представлены в форматах: день недели, число+месяц и день+месяц+год . Для полноты картины в листинге 3.16 показано содержимое файла .agenda со всеми дополнительными записями:
Листинг 3.16.Содержимое файла. agenda со всеми записями
$ cat ~/.agenda
14Feb|Valentine’s Day
25Dec|Christmas
3Aug|Dave’s birthday
4Jul|Independence Day (USA)
31Oct|Halloween
30Mar|Penultimate day of March
Sun|sleep late (hopefully)
30Mar2017|Check in with Steve about dinner
Усовершенствование сценария
Этот сценарий лишь слегка затронул сложную и интересную тему. Было бы неплохо включить в него возможность заглядывать на несколько дней вперед, добавив в сценарий agenda арифметические операции с датой. Если в системе используется GNU-версия команды date, выполнить такие операции будет проще простого. Если нет, тогда для операций с датой средствами командной оболочки придется написать довольно сложный код. Далее в книге мы еще вернемся к арифметике с датами, особенно в сценариях № 99, № 100 и № 101 в главе 15.
Читать дальше