Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - [121]

Шрифт
Интервал

>··else

>····pattern="$2[^0–9]"

>··fi

>··dayofweek="$(ncal $1 $3 | grep "$pattern" |  −c— c1-2)"

>··case $dayofweek in

>····Su) echo "That was a Sunday.";····;;

>····Mo) echo "That was a Monday.";····;;

>····Tu) echo "That was a Tuesday.";··;;

>····We) echo "That was a Wednesday.";;;

>····Th) echo "That was a Thursday.";··;;

>····Fr) echo "That was a Friday.";····;;

>····Sa) echo "That was a Saturday.";··;;

>··esac

>fi

>exit 0

Как это работает

Мы так нахваливали GNU date, и знаете почему? А потому, что весь сценарий сводится к к единственной команде в .

До смешного просто.

Если требуемая версия date недоступна, сценарий использует ncal , разновидность простой программы cal, которая представляет указанный месяц в любопытном, он очень полезном (!) формате:

>$ ncal 8 1990

>····August 1990

>Mo···· 6 13 20 27

>Tu···· 7 14 21 28

>We··1··8 15 22 29

>Th··2··9 16 23 30

>Fr··3 10 17 24 31

>Sa··4 11 18 25

>Su··5 12 19 26

Когда есть эта информация, для определения дня недели достаточно найти строку с соответствующим днем месяца и преобразовать двухбуквенное сокращение в полное название.

Запуск сценария

Нил Армстронг и Базз Олдрин прилунились на Базе Спокойствия 20 июля 1969 года, и, как сообщают результаты в листинге 15.2, это было воскресенье.

Листинг 15.2. Запуск сценария dayinpast с датой посадки Армстронга и Олдрина на Луну

>$ dayinpast 7 20 1969

>That was a Sunday.

День «Д» высадки союзнических войск в Нормандии, 6 июня 1944 года:

>$ dayinpast 6 6 1944

>That was a Tuesday.

А вот еще пример, день принятия Декларации о независимости США, 4 июля 1776 года:

>$ dayinpast 7 4 1776

>That was a Thursday.

Усовершенствование сценария

Все сценарии в этой главе принимают входные данные в формате месяц день год, но было бы хорошо дать пользователям возможность указывать данные в более привычном им виде, например: месяц/день/год. К счастью, это совсем несложно, и отличной отправной точкой вам послужит сценарий № 3 в главе 1.

№ 100. Вычисление дней между датами

Сколько дней вы живете? Сколько дней прошло с того момента, как ваши родители встретились? Подобные вопросы, связанные с определением разности между датами, возникают часто, но вычислить ответ на них обычно бывает непросто. И снова на помощь нам приходит утилита GNU date.

Идея обоих сценариев, № 100 и № 101, заключается в том, что суммируются дни от первой даты до конца года, дни от начала года до второй даты и число дней во всех промежуточных годах. Один и тот же подход можно использовать для вычисления количества дней, прошедших с некоторой даты в прошлом (этот сценарий), и количества дней, оставшихся до некоторой даты в будущем (сценарий № 101).

Листинг 15.3 довольно длинный. Готовы?

Код

Листинг 15.3. Сценарий daysago

>··#!/bin/bash

>··# daysago — получая дату в формате месяц/день/год, вычисляет количество

>··#·· дней, прошедших от нее до текущего дня, учитывая високосные годы, и пр.

>··# Если вы используете Linux, замените "$(which gdate)" на "$(which date)".

>··#·· Если вы используете OS X, установите пакет coreutils с помощью brew или

>··#·· из исходного кода, чтобы получить команду gdate.

>··date="$(which gdate)"

>··function daysInMonth

>··{

>····case $1 in

>······1|3|5|7|8|10|12) dim=31;; # Постоянное значение

>······4|6|9|11········) dim=30;;

>······2··············) dim=29;; # Зависит от года: високосный/невисокосный

>······*··············) dim=-1;; # Неизвестный месяц

>····esac

>··}

>

··function isleap

>··{

>····# Возвращает ненулевое значение в $leapyear, если $1 — високосный год.

>····leapyear=$($date −d 12/31/$1 +%j | grep 366)

>··}

>··#######################

>··#### ОСНОВНОЙ БЛОК

>··#######################

>··if [$# −ne 3]; then

>····echo "Usage: $(basename $0) mon day year"

>····echo " with just numerical values (ex: 7 7 1776)"

>····exit 1

>··fi

>

··$date −version > /dev/null 2>&1 # Отбросить сообщение об ошибке, если появится.

>··if [$? -ne 0]; then

>····echo "Sorry, but $(basename $0) can't run without GNU date." >&2

>····exit 1

>··fi

>··eval $($date "+thismon=%m;thisday=%d;thisyear=%Y;dayofyear=%j")

>··startmon=$1; startday=$2; startyear=$3

>··daysInMonth $startmon # Инициализирует глобальную переменную dim.

>··if [$startday −lt 0 −o $startday −gt $dim]; then

>····echo "Invalid: Month #$startmon only has $dim days." >&2

>····exit 1

>··fi

>··if [$startmon −eq 2 −a $startday −eq 29]; then

>····isleap $startyear

>····if [-z "$leapyear"]; then

>······echo "Invalid: $startyear wasn't a leap year; February had 28 days." >&2

>······exit 1

>····fi

>··fi

>··#######################

>··#### ВЫЧИСЛЕНИЕ КОЛИЧЕСТВА ДНЕЙ

>··#######################

>··#### ДНЕЙ В НАЧАЛЬНОМ ГОДУ

>··# Собрать строку формата с начальной датой.

>··startdatefmt="$startmon/$startday/$startyear"

>

··calculate="$((10#$($date −d "12/31/$startyear" +%j))) \

>····-$((10#$($date −d $startdatefmt +%j)))"

>··daysleftinyear=$(($calculate))

>··#### ДНЕЙ В ПРОМЕЖУТОЧНЫХ ГОДАХ

>··daysbetweenyears=0

>··tempyear=$(($startyear + 1))

>··while [$tempyear −lt $thisyear]; do

>····daysbetweenyears=$(($daysbetweenyears + \

>····$((10#$($date −d "12/31/$tempyear" +%j)))))

>····tempyear=$(($tempyear + 1))

>··done

>··#### ДНЕЙ В ТЕКУЩЕМ ГОДУ

>

··dayofyear=$($date +%j) # Это просто!

>··#### ТЕПЕРЬ СЛОЖИТЬ ВСЕ ВМЕСТЕ

>··totaldays=$(($((10#$daysleftinyear)) + \


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Тонкости реестра Windows Vista. Трюки и эффекты

Реестр Windows является важной частью операционной системы, во многом определяющей ее работу. Изучив приведенный в этой книге материал, вы научитесь редактировать реестр Windows Vista по своему усмотрению, а также освоите многочисленные приемы оптимизации содержащихся в нем настроек операционной системы.


Отладка систем реального времени

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Iptables Tutorial 1.1.19

Iptables Tutorial 1.1.19Автор: (C) Oskar AndreassonCopyright (C) 2001-2002 by Oskar AndreassonПеревод: (C) Андрей КиселевПоследнюю версию документа можно получить по адресу: http://iptables-tutorial.frozentux.netfb2-документ отформатирован с использованием большого количества тегов и . Чтобы в «читалке» (в частности, Haali Reader) текст выглядел «красиво», настройте свойства соотвествующих стилей (emphasis и strong), изменив, например, их цвета или начертания. (прим. автора fb2-документа)


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)