Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Если сценарию передается существующее имя пользователя, он должен вывести сводную информацию об этом пользователе GitHub, как показано в листинге 7.7.
Листинг 7.7.Запуск сценария githubuser
$ githubuser brandonprry
Brandon Perry is the name of the GitHub user.
They have 67 followers.
They are following 0 other users.
Their account was created on 2010-11-16T02:06:41Z.
Усовершенствование сценария
Этот сценарий имеет большой потенциал благодаря объему информации, возвращаемому GitHub API. Он выводит только четыре значения из возвращаемых JSON-данных. Создание «резюме» на основе информации, которую API возвращает подобно многим веб-службам, лишь одна из возможностей.
№ 56. Поиск по почтовому индексу
Для демонстрации еще одного приема извлечения информации из Интернета, на этот раз с помощью curl, создадим простой инструмент поиска почтовых индексов. Передайте сценарию в листинге 7.8 почтовый индекс, и вы узнаете город и штат (в США), которому он принадлежит. Достаточно просто.
Самой очевидной была бы идея использовать официальный веб-сайт почтовой службы США (US Postal Service), но мы задействуем другой сайт, http://city-data.com/, в котором для каждого почтового индекса отводится своя веб-страница, что упрощает извлечение информации.
Код
Листинг 7.8.Сценарий zipcode
#!/bin/bash
# zipcode — получая почтовый индекс, определяет город и штат в США.
#·· Использует сайт city-data.com, в котором для каждого почтового
#·· индекса отводится своя веб-страница.
baseURL="http://www.city-data.com/zips"
/bin/echo −n "ZIP code $1 is in "
curl −s — dump "$baseURL/$1.html" | \
··grep −i '
··cut −d\(-f2 | cut −d\) −f1
exit 0
Как это работает
Адреса URL страниц с информацией о почтовых индексах на сайте http://city-data.com/имеют единообразную организацию: сам почтовый индекс является заключительной частью URL:
http://www.city-data.com/zips/80304.html
Такое единообразие позволяет легко сконструировать адрес URL, соответствующий заданному почтовому индексу. Возвращаемая страница содержит название города в заголовке, которое легко отличить по открывающей и закрывающей круглым скобкам, как показано ниже:
schools, population, income, averages, housing, demographics, location,
statistics, residents and real estate info
Строка длинная, но легко поддается анализу!
Запуск сценария
Чтобы воспользоваться сценарием, достаточно просто передать ему почтовый индекс в аргументе командной строки. Если указан действительный индекс, сценарий выведет название города и штата, как показано в листинге 7.9.
Результаты
Листинг 7.9.Запуск сценария zipcode
$ zipcode 10010
ZIP code 10010 is in New York, New York
$ zipcode 30001
ZIP code 30001 is in
$ zipcode 50111
ZIP code 50111 is in Grimes, Iowa
Так как 30001 не является действительным почтовым индексом, сценарий сгенерировал сообщение об ошибке Page not found («Страница не найдена»). Оно выглядит немного неопрятно, но мы можем улучшить его.
Усовершенствование сценария
Наиболее очевидным усовершенствованием могло бы стать выполнение каких-то действий в ответ на ошибки вместо вывода невнятной последовательности . Еще более интересный вариант — добавить флаг −a, который сообщал бы сценарию о необходимости вывода дополнительной информации о регионе, тем более что http://city-data.com/предлагает довольно много информации, помимо названий городов, включая площадь, сведения о населении и цены на недвижимость.
№ 57. Поиск по телефонному коду города
Сценарий поиска по телефонному коду города является разновидностью предыдущего. Как оказывается, реализовать такой сценарий действительно очень просто, благодаря существованию простых для анализа веб-страниц с кодами городов. Например, страница по адресу http://www.bennetyee.org/ucsd-pages/area.htmlлегко поддается анализу, не только потому, что она хранит информацию в табличной форме, но и потому, что автор использовал атрибуты HTML для идентификации элементов. Например, строка с информацией о коде 207 выглядит так:
207
align=center>-5
Мы использовали этот сайт в сценарии (листинг 7.10) поиска по телефонному коду города.
Код
Листинг 7.10.Сценарий areacode
#!/bin/bash
# areacode — получая трехзначный телефонный код, действующий в США,
#·· определяет город и штат по данным в простой табличной форме, на
#·· веб-сайте Беннета Йи (Bennet Yee).
source="http://www.bennetyee.org/ucsd-pages/area.html"
if [-z "$1"]; then
··echo "usage: areacode "
··exit 1
fi
# wc −c вернет количество символов + символ перевода строки,
#·· то есть для 3 цифр = 4 символа
if ["$(echo $1 | wc −c)" −ne 4]; then
··echo "areacode: wrong length: only works with three-digit US area codes"
··exit 1
fi
# Все символы — цифры?
if [! -z "$(echo $1 | sed 's/[[: digit: ]]//g')"]; then
··echo "areacode: not-digits: area codes can only be made up of digits"
··exit 1
fi
# Теперь можно выполнить поиск по телефонному коду…
result="$(
curl −s — dump $source | grep "name=\"$1" | \
··sed 's/<[^>]*>//g;s/^ //g' | \
··cut −f2- d\ | cut −f1 −d\()"
echo "Area code $1 =$result"
exit 0
Как это работает
Основная часть этого сценария выполняет проверку ввода, чтобы убедиться, что телефонный код, указанный пользователем, действителен. Наиболее важна тут команда curl — она извлекает данные из сети и передает их по конвейеру команде sed для анализа и команде cut для выделения информации, которую требуется вывести.
Запуск сценария
Этот сценарий принимает единственный аргумент — телефонный код города для поиска. Примеры использования сценария демонстрируются листинге 7.11.
Результаты
Листинг 7.11.Тестирование сценария areacode
$ areacode 817
Area code 817 = N Cent. Texas: Fort Worth area
$ areacode 512
Area code 512 = S Texas: Austin
$ areacode 903
Area code 903 = NE Texas: Tyler
Усовершенствование сценария
Самое простое усовершенствование, которое можно предложить, — реализовать обратный поиск, когда по названию города и штата сценарий находит и выводит все телефонные коды, соответствующие заданному городу.
№ 58. Слежение за погодой
Если вы проводите весь день в кабинете или в серверном зале, уткнувшись носом в терминал, вам наверняка иногда очень хочется выйти на улицу, прогуляться, особенно в хорошую погоду. Weather Underground ( http://www.wunderground.com/) — отличный веб-сайт, который предлагает прикладной интерфейс (API) с бесплатным доступом для разработчиков. Вам нужно только зарегистрировать API-ключ. Имея API-ключ, можно написать короткий сценарий командной оболочки (показан в листинге 7.12), сообщающий, насколько хороша (или плоха) погода. Знание погоды поможет нам решить, стоит ли выходить на короткую прогулку.
Читать дальшеИнтервал:
Закладка: