··checkDate $weekday $day $month $year
··exit 0
Как это работает
Сценарии addagenda и agenda поддерживают три типа событий: еженедельные («каждую среду»), ежегодные («каждого 3 августа») и однократные («1 января 2017»). В процессе добавления записей в файл событий их даты нормализуются и сжимаются так, что 3 August превращается в 3Aug, а Thursday превращается в Thu. Эта операция выполняется функцией normalize в сценарии addagenda
Данная функция отсекает все, что следует за третьим символом, и преобразует первый символ в верхний регистр, а два остальных — в нижний. Такой формат соответствует стандартным сокращенным названиям дней недели и месяцев в выводе команды date, что необходимо для правильной работы сценария agenda. Остальная часть сценария addagenda не содержит ничего сложного; бо́льшую его часть занимает проверка формата введенных данных.
Наконец, в строке
Сценарий 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