$ dateThu Sep 29 15:23:12 EDT 1983$ cat bin/calendar# calendar: version 1 - today onlyawk <$HOME/calendar ' BEGIN { split ("'"`date`"'", date) } $1 == date[2] && $2 == date[3]' | mail $NAME$Функция в части
BEGINdateNAMEdateawk$ cat /bin/calendar# calendar: version 2 - today only, no quotes(date; cat $HOME/calendar) |awk ' NR == 1 { mon = $2; day = $3 } # set the date NR > 1 && $1 == mon && $2 == day # print calendar lines' | mail $NAME$На следующем шаге требуется так изменить программу, чтобы искать сообщение с завтрашней датой так же, как и с сегодняшней. Наибольшие усилия затрачиваются на прибавление единицы к сегодняшнему числу. Но в конце месяца нужно перейти к следующему месяцу, а число приравнять единице. Конечно, число дней в разных месяцах различно. Именно здесь на помощь приходит ассоциативный массив. Два массива
daysnextmondays["Jan"]nextmon["Jan"]Febdays["Jan"] = 31; nextmon["Jan"] = "Feb"days["Feb"] = 28; nextmon["Feb"] = "Mar"...мы воспользуемся функцией
split$ cat calendar# calendar: version 3 -- today and tomorrowawk <$HOME/calendar 'BEGIN { x = "Jan 31 Feb 28 Mar 31 Apr 30 May 31 Jun 30 " \ "Jul 31 Aug 31 Sep 30 Oct 31 Nov 30 Dec 31 Jan 31" split(x, data) for (i = 1; i < 24; i += 2) { days[data[i]] = data[i+1] nextmon[data[i]] = data[i+2] } split("'"`date`", date) mon1 = date[2]; day1 = date[3] mon2 = mon1; day2 = day1 + 1 if (day1 >= days[mon1]) { day2 = 1 mon2 = nextmon[mon1] }}$1 == mon1 && $2 == day1 || $1 == mon2 && $2 == day2' | mail $NAME$Обратите внимание на то, что
JanНа последнем шаге нужно обеспечить запуск программы календаря на каждый день. Можно делать это и самому, не забывая задавать команду (каждый день!)
$ at 5 amcalendarctl-d$Однако такое решение нельзя считать автоматическим или надежным. Хитрость заключается в том, чтобы не только запустить программу
calendar$ cat early.morningcalendarecho early morning | at 5am$Вторая строка файла
early.morningatatPATHИзмените программу
calendarДолжна ли программа календарь учитывать даты, находящиеся в середине строки, а не только в ее начале? Как быть с датой, заданной в другом формате, например 10/1/83?
Почему в программе
calendar$NAMEgetnameНапишите вашу версию команды rm, которая не удаляет файлы, а пересылает их во временный каталог, используя команду
atЯзык
awk