Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
с атрибутом class="findHeader" и текстом No results («Нет результатов»). Именно эту ситуацию проверяет команда в строке
. Далее следует простая проверка: если содержимое $fail имеет ненулевую длину, сценарий сообщает об отсутствии результатов.
Однако если $fail ничего не содержит, это означает, что поиск по заданному шаблону удался и в файле хранятся некоторые результаты. Далее в результатах выполняется поиск шаблона /title/tt, но здесь есть одна сложность: разобрать результаты, возвращаемые базой данных IMDb, очень непросто, потому что для каждой заданной ссылки в результатах имеется несколько совпадений. Остальная последовательность замысловатых команд sed|grep|sed пытается идентифицировать и удалить повторяющиеся совпадения и оставить только то, что имеет значение.
Кроме того, когда IMDb находит совпадение, такое как "Lawrence of Arabia (1962)", она возвращает название и год в двух разных элементах HTML, в двух разных строках. М-да. Однако год нам определенно необходим, чтобы различать фильмы с одинаковыми названиями. Этим занимается команда awk в строке ,используя весьма хитроумный способ.
Для тех, кто не знаком с awk, отметим, что в общем случае awk-сценарий имеет следующую организацию: (условие) { действие }. Эта строка сохраняет нечетные строки в $title, и затем, когда очередь доходит до четной строки (с годом и данными о соответствии), она выводит предыдущую и текущую строки в одну строку.
Запуск сценария
Хотя этот сценарий невелик, он обладает большой гибкостью в отношении формата входных данных, как видно из листинга 7.15. Вы можете указать название фильма в кавычках или как набор отдельных слов, а можете ввести восьмизначный числовой код IMDb, чтобы выбрать конкретный фильм.
Результаты
Листинг 7.15.Запуск сценария moviedata
$ moviedata lawrence of arabia
0056172: Lawrence of Arabia (1962)
0245226: Lawrence of Arabia (1935)
0390742: Mighty Moments from World History (1985) (TV Series)
1471868: Mystery Files (2010) (TV Series)
1471868: Mystery Files (2010) (TV Series)
1478071: Lawrence of Arabia (1985) (TV Episode)
1942509: Lawrence of Arabia (TV Episode)
1952822: Lawrence of Arabia (2011) (TV Episode)
$ moviedata 0056172
Lawrence of Arabia (1962)
····A flamboyant and controversial British military figure and his
····conflicted loyalties during his World War I service in the Middle East.
Усовершенствование сценария
Одним из очевидных усовершенствований этого сценария могло бы стать удаление числовых кодов IMDb из вывода. Не составит труда скрыть коды (потому что, как показывает практика, они трудно запоминаются и пользователи допускают в них опечатки) и реализовать в сценарии вывод простого меню с уникальными индексами, которые могут применяться для выбора конкретного фильма.
В ситуации, когда для шаблона, заданного пользователем, обнаруживается только одно совпадение (попробуйте выполнить команду moviedata monsoon wedding), сценарий мог бы распознавать это, извлекать из полученных данных числовой код фильма и повторно вызывать самого себя, чтобы получить более подробную информацию. Вот такой круговорот получается!
Основная проблема этого и большинства других сценариев, извлекающих информацию из сторонних веб-сайтов, в том, что, если IMDb изменит верстку своей страницы, сценарий станет неработоспособным и вам придется исправлять его. Это скрытая ошибка, ждущая своего часа, но с такими сайтами, как IMDb, которые не меняются годами, вероятно, не особенно опасная.
№ 60. Пересчет валют по курсу
В первом издании этой книги задача пересчета денежных сумм из одной валюты в другую оказалась довольно сложной, и для ее решения потребовалось написать два сценария: один извлекал сведения о курсах валют из финансового веб-сайта и сохранял их в особом формате, а другой использовал эти данные для фактического пересчета, например, из долларов США в евро. В минувшие годы, однако, Всемирная паутина продолжала развиваться, и сейчас мы не видим причин перелопачивать горы информации, когда имеются такие сайты, как Google, предлагающие простые и дружественные для использования из сценариев калькуляторы.
Представленный в листинге 7.16 сценарий пересчета валют по курсу просто использует валютный калькулятор, доступный по адресу: http://www.google.com/finance/converter.
Код
Листинг 7.16.Сценарий convertcurrency
#!/bin/bash
# convertcurrency — принимая сумму и базовую валюту, пересчитывает эту
#·· сумму в другой валюте. Для обозначения валют используются идентификаторы
#·· ISO. Для фактических вычислений использует валютный калькулятор Google:
#·· http://www.google.com/finance/converter
if [$# −eq 0]; then
··echo "Usage: $(basename $0) amount currency to currency"
··echo "Most common currencies are CAD, CNY, EUR, USD, INR, JPY, and MXN"
··echo "Use \"$(basename $0) list\" for a list of supported currencies."
fi
if [$(uname) = "Darwin"]; then
··LANG=C # Для решения проблемы в OS X с ошибочными последовательностями
········ #·· байтов и lynx
fi
url="https://www.google.com/finance/converter"
tempfile="/tmp/converter.$$"
lynx=$(which lynx)
# Так как эти данные используются многократно, извлечем их,
#·· а потом займемся всем остальным.
currencies=$($lynx −source "$url" | grep "option value=" | \
··cut −d\" −f2- | sed 's/">/ /' | cut −d\(-f1 | sort | uniq)
########### Выполнить все запросы, не связанные с пересчетом.
if [$# −ne 4]; then
··if ["$1" = "list"]; then
····# Вывести список всех символов валют, известных калькулятору.
····echo "List of supported currencies: "
····echo "$currencies"
··fi
··exit 0
fi
########### Теперь выполним пересчет.
if [$3!= "to"]; then
··echo "Usage: $(basename $0) value currency TO currency"
··echo "(use \"$(basename $0) list\" to get a list of all currency values)"
··exit 0
fi
amount=$1
basecurrency="$(echo $2 | tr '[: lower: ]' '[: upper: ]')"
targetcurrency="$(echo $4 | tr '[: lower: ]' '[: upper: ]')"
# Наконец, фактический вызов калькулятора!
$lynx −source "$url?a=$amount&from=$basecurrency&to=$targetcurrency" | \
··grep 'id=currency_converter_result' | sed 's/<[^>]*>//g'
exit 0
Как это работает
Валютный калькулятор Google принимает три параметра непосредственно в URL: сумму, исходную валюту и конечную валюту. Как выглядит такой URL, можно видеть в следующем примере, запрашивающем пересчет 100 долларов США в мексиканские песо:
https://www.google.com/finance/converter?a=100&from=USD&to=MXN
Сценарий ожидает, что пользователь определит все три поля в аргументах, и затем передает их сайту Google в URL.
Сценарий также выводит несколько сообщений с информацией о порядке использования, что намного упрощает работу с ним. Чтобы увидеть эти сообщения, перейдем к разделу с демонстрационными примерами.
Читать дальшеИнтервал:
Закладка: