#!/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), сообщающий, насколько хороша (или плоха) погода. Знание погоды поможет нам решить, стоит ли выходить на короткую прогулку.
Листинг 7.12.Сценарий weather
··#!/bin/bash
··# weather — использует Wunderground API для получения информации
··#·· о погоде по почтовому индексу (США).
··if [$# −ne 1]; then
····echo "Usage: $0 "
····exit 1
··fi
··apikey="b03fdsaf3b2e7cd23" # Это недействительный API-ключ — вы
···························· #·· должны получить свой.
··weather=`curl −s \
······"https://api.wunderground.com/api/$apikey/conditions/q/$1.xml"`
··state=`xmllint −xpath \
······//response/current_observation/display_location/full/text\(\) \
······<(echo $weather)`
··zip=`xmllint −xpath \
······//response/current_observation/display_location/zip/text\(\) \
······<(echo $weather)`
··current=`xmllint −xpath \
······//response/current_observation/temp_f/text\(\) \
······<(echo $weather)`
··condition=`xmllint −xpath \
······//response/current_observation/weather/text\(\) \
······<(echo $weather)`
··echo $state" ("$zip"): Current temp "$current" F and "$condition" outside."
··exit 0
Сценарий вызывает команду curl, чтобы отправить запрос к Wunderground API и сохранить HTTP-ответ в переменной weather
. Затем он использует утилиту xmllint (ее легко установить с помощью диспетчера пакетов, такого как apt, yum или brew) для выполнения XPath-запроса к полученным данным
, причем в конце каждого вызова xmllint применяется интересный синтаксис <(echo $weather), поддерживаемый языком bash. Эта конструкция принимает вывод команды внутри скобок и передает его указанной программе в виде дескриптора файла, то есть программа думает, что читает настоящий файл. После выборки необходимой информации из полученных данных в формате XML она выводится в виде удобочитаемого сообщения с краткими сведениями о погоде.
Читать дальше