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

Здесь есть возможность читать онлайн «Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб., Год выпуска: 2017, ISBN: 2017, Издательство: Питер, Жанр: Программирование, ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Сценарии командной оболочки помогают системным администраторам и программистам автоматизировать рутинные задачи с тех самых пор, как появились первые компьютеры. С момента выхода первого издания этой книги в 2004 году многое изменилось, однако командная оболочка bash только упрочила свои лидирующие позиции. Поэтому умение использовать все ее возможности становится насущной необходимостью для системных администраторов, инженеров и энтузиастов. В этой книге описываются типичные проблемы, с которыми можно столкнуться, например, при сборке программного обеспечения или координации действий других программ. А решения даются так, что их легко можно взять за основу и экстраполировать на другие схожие задачи.
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.

Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

№ 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

··}

картинка 583··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

картинка 584··$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"

картинка 585··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

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

картинка 586··dayofyear=$($date +%j) # Это просто!

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

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

····$((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

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

Сценарий получился довольно длинным, но не слишком сложным. Функция определения високосного года картинка 587достаточно простая — она всего лишь проверяет, равно ли количество дней в году 366.

В строке картинка 588выполняется интересная проверка наличия GNU-версии date в системе перед продолжением работы.

Оператор перенаправления отбрасывает любой вывод и сообщения об ошибках, а возвращаемый код проверяется на неравенство нулю, которое свидетельствует об ошибке при попытке разобрать параметр −version. В OS X, например, устанавливается версия date с минимальными возможностями — она не поддерживает параметра −version и многих других.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание»

Представляем Вашему вниманию похожие книги на «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание»

Обсуждение, отзывы о книге «Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x