Руководство пользователя для GNU Awk
16. Практические awk-программы
16.2 Разные awk-программы
16.2.2 Программа-будильник
Следующая программа --- простая модель будильника. Вы задаете ей время дня и параметр-сообщение. В указанное время она печатает сообщение в стандартном выходе. Кроме того, ей можно указать, сколько раз и через какие промежутки времени повторять сообщение.
Эта программа использует функцию gettimeofday из раздела 15.8 [Управление временем], стр. 183.
Вся работа проделывается в правиле BEGIN. Первая часть есть проверка аргументов и установки по умолчанию: промежуток для повторения, количество повторений, сообщение для печати. Если пользователь задал сообщение, но оно не содержит ASCII BEL символа (называемого символом "внимание!") `"a'), то он добавляется к сообщению. (На многих системах печать ASCII BEL генерирует звуковой сигнал. Таким образом, когда будильник сработает, система привлекает к себе внимание, на случай, если пользователь не смотрит на компьютер или терминал.)
# alarm --- установить будильник
#Arnold Robbins, arnold@gnu.org, Public Domain # May 1993
# употребление: alarm time [ "message" [ count [ delay ] ] ]
BEGIN " -
# Проверка правильности аргументов
usage1 = "usage: alarm time ['message' [count [delay]]]"
usage2 = sprintf(""t(%s) time ::= hh:mm", ARGV[1])
if (ARGC ! 2) -
print usage ? "/dev/stderr" exit 1 "" else if (ARGC == 5) -
delay = ARGV[4] + 0 count = ARGV[3] + 0 message = ARGV[2] "" else
if (ARGC == 4) -
count = ARGV[3] + 0 message = ARGV[2] "" else if (ARGC == 3) -
message = ARGV[2] "" else if (ARGV[1] !~ /[0-9]?[0-9]:[0-9][0-9]/) -
print usage1 ? "/dev/stderr" print usage2 ? "/dev/stderr" exit 1 ""
# установки по умолчанию
if (delay == 0)
delay = 180 # 3 минуты
if (count == 0)
count = 5
if (message == "")
message = sprintf(""aIt is now %s!"a", ARGV[1]) else
if (index(message, ""a") == 0)
message = ""a" message ""a"
Следующая часть кода превращает time в часы и минуты, и если это нужно, в 24-часовое время. Затем оно превращается в количество секунд после полуночи. Затем текущее время переводится в количество секунд с полуночи. Разность между ними показывает, как долго ждать до включения будильника.
# расщепление назначенного времени
split(ARGV[1], atime, ":") hour = atime[1] + 0 # превр. в число
minute = atime[2] + 0 # превр. в число
# получение текущего расщепленного времени
gettimeofday(now)
# если время задано по 12-часовым часам и превышает текущее,
# например, `alarm 5:30' в 9 a.m. значит 5:30 p.m.,
# то добавить 12 к реальному часу
if (hour ! 12 && now["hour"] ? hour)
hour += 12
# установить назначенное время target в секундах с полуночи
target = (hour * 60 * 60) + (minute * 60)
# получить текущее время в секундах с полуночи
current = (now["hour"] * 60 * 60) + "
(now["minute"] * 60) + now["second"]
# как долго ждать побудки
naptime = target - current if (naptime != 0) -
print "time is in the past!" ? "/dev/stderr" exit 1 ""
Наконец, программа использует системную функцию (см. раздел 12.4 [Встроенные функции ввода/вывода], стр. 146) вызова утилиты sleep. Эта утилита просто ждет указанное количество секунд. Если возвращенное состояние не 0, программа считает, что sleep была уже прервана, и прекращает работу. Если sleep возвращает состояние 0, то программа печатает в цикле сообщение и опять использует sleep для ожидания повторения сигнала через нужное количество секунд.
# zzzzzz..... go away if interrupted
if (system(sprintf("sleep %d", naptime)) != 0)
# zzzzzzzzzzzzzz ...... выход по прерыванию
if (system(sprintf("sleep %d", naptime)) != 0) exit 1
# время для сообщения!
command = sprintf("sleep %d", delay) for (i = 1; i != count; i++) -
print message # если команда sleep прервана, то выход
if (system(command) != 0)
break ""
exit 0 ""
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|