UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
$ 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
