Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - [122]
>····$((10#$daysbetweenyears)) + \
>····$((10#$dayofyear))))
>··/bin/echo −n "$totaldays days have elapsed between "
>··/bin/echo −n "$startmon/$startday/$startyear "
>··echo "and today, day $dayofyear of $thisyear."
>··exit 0
Как это работает
Сценарий получился довольно длинным, но не слишком сложным. Функция определения високосного года
В строке
выполняется интересная проверка наличия GNU-версии date в системе перед продолжением работы.Оператор перенаправления отбрасывает любой вывод и сообщения об ошибках, а возвращаемый код проверяется на неравенство нулю, которое свидетельствует об ошибке при попытке разобрать параметр −version. В OS X, например, устанавливается версия date с минимальными возможностями — она не поддерживает параметра −version и многих других.
Далее остается только выполнить простейшие арифметические операции. Спецификатор %j возвращает номер дня в году, поэтому вычисление дней, оставшихся до конца года от начальной даты выполняется просто:
. Суммарное количество дней в промежуточных годах вычисляется в цикле while, в котором очередной год хранится в переменной tempyear.Наконец, определение числа дней от начала текущего года до текущей даты реализуется проще простого:
.>dayofyear=$($date +%j)
Затем остается только сложить полученные дни и вывести результат!
Запуск сценария
Вернемся вновь в листинге 15.4 к историческим датам, рассматривавшимся выше.
Листинг 15.4. Запуск сценария daysago для разных дат
>$ daysago 7 20 1969
>17106 days have elapsed between 7/20/1969 and today, day 141 of 2016.
>$ daysago 6 6 1944
>26281 days have elapsed between 6/6/1944 and today, day 141 of 2016.
>$ daysago 1 1 2010
>2331 days have elapsed between 1/1/2010 and today, day 141 of 2016.
Эти команды были выполнены… Пусть date скажет за нас:
>$ date
>Fri May 20 13:30:49 UTC 2016
Усовершенствование сценария
Имеется одно ошибочное условие, которое не проверяется сценарием: когда прошлая дата находится лишь в нескольких днях от текущей или даже в будущем. Что получится в таких ситуациях и как исправить эту ошибку? (Совет: загляните в сценарий № 101, где вы найдете дополнительные проверки, которые можно применить в этом сценарии.)
№ 101. Вычисление дней до указанной даты
Логичным дополнением сценария № 100, daysago, является другой сценарий, daysuntil. Он, по сути, выполняет те же вычисления, но сначала подсчитывает количество дней, оставшихся до конца текущего года, затем количество дней в промежуточных годах и количество дней до указанной даты в целевом году, как показано в листинге 15.5.
Код
Листинг 15.5. Сценарий daysuntil
>··#!/bin/bash
>··# daysuntil — фактически выполняет те же вычисления, что и daysago,
>··#·· но в обратном порядке, когда текущая дата становится "датой в прошлом",
>··#·· а дата в будущем — "текущей".
>··# Так же, как в предыдущем сценарии, используйте 'which gdate’ в OS X
>··#·· и 'which date' в Linux.
>··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: 1 1 2020)"
>····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")
>··endmon=$1; endday=$2; endyear=$3
>··# Необходимые проверки параметров…
>··daysInMonth $endmon # Инициализирует переменную $dim
>··if [$endday −lt 0 −o $endday −gt $dim]; then
>····echo "Invalid: Month #$endmon only has $dim days." >&2
>····exit 1
>··fi
>··if [$endmon −eq 2 −a $endday −eq 29]; then
>····isleap $endyear
>····if [-z "$leapyear"]; then
>······echo "Invalid: $endyear wasn't a leapyear; February had 28 days." >&2
>······exit 1
>····fi
>··fi
>··if [$endyear −lt $thisyear]; then
>····echo "Invalid: $endmon/$endday/$endyear is prior to the current year." >&2
>····exit 1
>··fi
>··if [$endyear −eq $thisyear −a $endmon −lt $thismon]; then
>····echo "Invalid: $endmon/$endday/$endyear is prior to the current month." >&2
>····exit 1
>··fi
>··if [$endyear −eq $thisyear −a $endmon −eq $thismon −a $endday −lt $thisday]
>··then
>····echo "Invalid: $endmon/$endday/$endyear is prior to the current date." >&2
>····exit 1
>··fi
>··if [$endyear −eq $thisyear −a $endmon −eq $thismon −a $end −e— eq $thisday]
>··then
>····echo "There are zero days between $endmon/$endday/$endyear and today." >&2
>····exit 0
>··fi
>··#### Если целевая дата находится в этом же году,
>··####·· вычисления должны выполняться немного иначе.
>··if [$endyear −eq $thisyear]; then
>····totaldays=$(($($date −d "$endmon/$endday/$endyear" +%j) −$($date +%j)))
Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.
Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.
Реестр Windows является важной частью операционной системы, во многом определяющей ее работу. Изучив приведенный в этой книге материал, вы научитесь редактировать реестр Windows Vista по своему усмотрению, а также освоите многочисленные приемы оптимизации содержащихся в нем настроек операционной системы.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
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)