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

Тут можно читать онлайн Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Питер, год 2017. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2017
  • Город:
    СПб.
  • ISBN:
    978-5-496-03029-8
  • Рейтинг:
    5/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

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

Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать книгу онлайн бесплатно, автор Дейв Тейлор
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

··exceedsDaysInMonth()

··{

····# С учетом названия месяца и числа дней в этом месяце, данная функция

····# вернет: 0, если указанное число меньше или равно числу дней в месяце;

····# 1 — в противном случае.

картинка 69····case $(echo $1|tr '[: upper: ]' '[: lower: ]') in

······jan*) days=31;; feb*) days=28;;

······mar*) days=31;; apr*) days=30;;

······may*) days=31;; jun*) days=30;;

······jul*) days=31;; aug*) days=31;;

······sep*) days=30;; oct*) days=31;;

······nov*) days=30;; dec*) days=31;;

········*) echo "$0: Unknown month name $1" >&2

············exit 1

····esac

····if [$2 −lt 1 −o $2 −gt $days]; then

······return 1

····else

······return 0 # Число месяца допустимо.

····fi

··}

··isLeapYear()

··{

····# Эта функция возвращает 0, если указанный год является високосным;

····#·· иначе возвращается 1.

····# Правила проверки високосного года:

····#·· 1. Если год не делится на 4, значит, он не високосный.

····#·· 2. Если год делится на 4 и на 400, значит, он високосный.

····#·· 3. Если год делится на 4, не делится на 400 и делится

····#······на 100, значит, он не високосный.

····#·· 4. Любой другой год, который делится на 4, является високосным.

····year=$1

картинка 70····if ["$((year % 4))" −ne 0]; then

······return 1 # Nope, not a leap year.

····elif ["$((year % 400))" −eq 0]; then

······return 0 # Yes, it's a leap year.

····elif ["$((year % 100))" −eq 0]; then

······return 1

····else

······return 0

····fi

··}

··# Начало основного сценария

··# =================

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

····echo "Usage: $0 month day year" >&2

····echo "Typical input formats are August 3 1962 and 8 3 1962" >&2

····exit 1

··fi

··# Нормализовать дату и сохранить для проверки на ошибки.

картинка 71··newdate="$($normdate "$@")"

··if [$? -eq 1]; then

····exit 1 # Error condition already reported by normdate

··fi

··# Разбить нормализованную дату, в которой

··#·· первое слово = месяц, второе слово = число месяца

··#·· третье слово = год.

··month="$(echo $newdate | cut −d\ −f1)"

··day="$(echo $newdate | cut −d\ −f2)"

··year="$(echo $newdate | cut −d\ −f3)"

··# После нормализации данных проверить допустимость

··#·· числа месяца (например, Jan 36 является недопустимой датой).

··if! exceedsDaysInMonth $month "$2"; then

····if ["$month" = "Feb" −a "$2" −eq "29"]; then

······if! isLeapYear $3; then

картинка 72········echo "$0: $3 is not a leap year, so Feb doesn't have 29 days." >&2

········exit 1

······fi

····else

······echo "$0: bad day value: $month doesn't have $2 days." >&2

······exit 1

····fi

··fi

··echo "Valid date: $newdate"

··exit 0

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

Этот сценарий было очень интересно писать, потому что он требует проверки большого количества непростых условий: числа месяца, високосного года и так далее. Логика сценария не просто проверяет месяц как число от 1 до 12 или день — от 1 до 31. Чтобы сценарий проще было писать и читать, в нем используются специализированные функции.

Первая функция, exceedsDaysInMonth(), анализирует месяц, указанный пользователем, разрешая вероятные допущения (например, пользователь может передать название JANUAR, и оно будет правильно опознано). Анализ выполняется инструкцией case в строке картинка 73, которая преобразует свой аргумент в нижний регистр и затем сравнивает полученное значение с константами, чтобы получить число дней в месяце. Единственный недостаток — для февраля функция всегда возвращает 28 дней.

Вторая функция, isLeapYear(), с помощью простых арифметических проверок выясняет, содержит ли февраль в указанном году 29-е число картинка 74.

В основном сценарии исходные данные передаются сценарию normdate, представленному выше, для нормализации картинка 75и затем разбиваются на три поля: $month, $day и $year. Затем вызывается функция exceedsDaysInMonth для проверки допустимости указанного числа для данного месяца, при этом 29 февраля обрабатывается отдельно — в этом случае вызовом функции isLeapYear проверяется год картинка 76и при необходимости выводится сообщение об ошибке. Если пользовательская дата успешно преодолела все проверки, значит, она допустимая!

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

Запуская сценарий (как показано в листинге 1.15), введите в командной строке дату в формате месяц-день-год. Месяц можно указать в виде трехсимвольного сокращения, полного названия или числа; год должен состоять из четырех цифр.

Результаты

Листинг 1.15.Тестирование сценария valid-date

$ valid-date august 3 1960

Valid date: Aug 3 1960

$ valid-date 9 31 2001

valid-date: bad day value: Sep doesn’t have 31 days.

$ valid-date feb 29 2004

Valid date: Feb 29 2004

$ valid-date feb 29 2014

valid-date: 2014 is not a leap year, so Feb doesn’t have 29 days.

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

Подход, аналогичный используемому в этом сценарии, можно применить для проверки значения времени в 24-часовом формате или в 12-часовом формате с суффиксом AM/PM (Ante Meridiem/Post Meridiem — пополуночи/пополудни). Разбив значение времени по двоеточиям, нужно убедиться, что число минут и секунд (если указано) находится в диапазоне от 0 до 59, и затем проверить первое поле на вхождение в диапазон от 0 до 12, если присутствует суффикс AM/PM, или от 0 до 24, если предполагается 24-часовой формат. К счастью, несмотря на существование секунд координации (високосных секунд) и других небольших корректировок, помогающих сохранить сбалансированность календарного времени, их можно игнорировать в повседневной работе, то есть нет необходимости использовать замысловатые вычисления.

При наличии доступа к GNU-команде date в Unix или GNU/Linux можно использовать совершенно иной способ проверки високосных лет. Попробуйте выполнить следующую команду и посмотрите, что получится:

$ date −d 12/31/1996 +%j

Если у вас в системе используется новейшая, улучшенная версия date, вы получите результат 366. Более старая версия просто пожалуется на ошибочный формат входных данных. Теперь подумайте о результате, возвращаемом новейшей командой date. Сможете ли вы написать двухстрочную функцию, проверяющую високосный год?

Наконец, данный сценарий слишком терпимо относится к названиям месяцев, например, название febmama будет опознано как допустимое, потому что инструкция case в строке картинка 77проверяет только первые три буквы. Эту проблему можно устранить, организовав точную проверку общепринятых сокращений (таких как feb) и полных названий месяцев (february), и даже некоторых типичных опечаток (febuary). Все это легко реализуется, было бы желание!

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

Интервал:

Закладка:

Сделать


Дейв Тейлор читать все книги автора по порядку

Дейв Тейлор - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание, автор: Дейв Тейлор. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x