Листинг 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.
Сценарий также выводит несколько сообщений с информацией о порядке использования, что намного упрощает работу с ним. Чтобы увидеть эти сообщения, перейдем к разделу с демонстрационными примерами.
Сценарий спроектирован так, что им очень легко пользоваться, как можно заметить в листинге 7.17, однако знание валют хотя бы нескольких стран лишним не будет.
Листинг 7.17.Запуск сценария convertcurrency
$ convertcurrency
Usage: convert amount currency to currency
Most common currencies are CAD, CNY, EUR, USD, INR, JPY, and MXN
Use "convertcurrency list" for a list of supported currencies.
$ convertcurrency list | head -10
List of supported currencies:
AED United Arab Emirates Dirham
AFN Afghan Afghani
ALL Albanian Lek
AMD Armenian Dram
ANG Netherlands Antillean Guilder
AOA Angolan Kwanza
ARS Argentine Peso
AUD Australian Dollar
AWG Aruban Florin
$ convertcurrency 75 eur to usd
75 EUR = 84.5132 USD
Усовершенствование сценария
Несмотря на строгость и простоту веб-калькулятора, в вывод результатов все же можно добавить немного порядка. Например, вывод результатов пересчета в листинге 7.17 лишен смысла, поскольку сумма в долларах США в нем выражена числом с четырьмя знаками после запятой, даже при том, что для отображения количества центов достаточно двух знаков. Правильнее было бы вывести 84,51 или округлить до 84,52. Эту ошибку в сценарии желательно исправить.
И еще, пока вы не отвлеклись, хорошо бы добавить в сценарий проверку сокращенных обозначений валют. Пригодилось бы и преобразование кодов валют в полные названия, например, чтобы можно было выяснить, что AWG — это арубанские флорины или что BTC — это Bitcoin (Биткоин).
№ 61. Извлечение информации об адресе Биткоин
Система Биткоин (Bitcoin) вихрем ворвалась в наш мир, и даже появились компании, полностью основанные на цепочках блоков (blockchain, базовой технологии, на которой основана эта криптовалюта). Для тех, кому приходится работать с данной системой, получение полезной информации о конкретном адресе Биткоин нередко становится главной проблемой. Однако мы легко можем автоматизировать сбор данных с использованием короткого сценария на языке командной оболочки, представленного в листинге 7.18.
Читать дальше