kstep 06.02.2010 16:24
Tips & tricks — Консольный скрипт для конверсии курса валют
Написал уже очень давно, с тех пор пользую постоянно почти без модификаций(в прошлом году только пофиксил один неприятны баг, да и только).
Так что считаю эту версию достаточно обкатанной и безглючной, чтобы поделиться.
Скрипт на чистом /bin/sh.
Пример использования:
$ ccc 1000 usd rur
Updating currency database (/home/kstep/tmp/currencies.txt)...ok!
30466.60829264
$ ccc 500000 byr usd
173.06980644
Для расчёта курсов использует XML-фид с сайта ЦБ РФ (http://www.cbr.ru/scripts/XML_daily.asp).
Из русских рублей в любую валюту и из любой валюты в русские рубли считает напрямую,
в остальных случаях пересчёт из валюты в валюту ведётся через русские рубли
(ЦБ РФ всё же курс для RUR выдаёт =).
Обновление локальной базы данных валют происходит при запуске скрипта если база данных старше 1 дня.
Сам скрипт:
Подробности реализации:
Использует замечательный стековый калькулятор dc (тогда была потребность в изучении чего-то нового).
Пример его работы:
dc -e "6 3 / p" => поделить 6 на 3 и вывести результат (p)
проще всего читать в стиле магистра Йоды: «6 на 3 поделить (/) и печатать ((p)rint)»
Подробнее читайте мануалы: полное его описание выходит за рамки короткой статьи.
Ещё один момент «магии»: проверка на необходимость обновления локальной «базы данных» валют.
Делается командой
FDBF=`find $DBFILE -mtime -1 2> /dev/null`
То есть ищется файл с базой данных, модифицированный менее 1 дня назад.
Тут варианта два: либо файл реально есть, но модифицирован (т.е. обновлён) более дня назад, и значит его надо обновить,
либо файла нет, потёр его кто-то или скрипт запущен первый раз, и значит его надо создать.
В любом из таких случаев find не найдёт этот файл и мы узнаем, что его нужно перегенерить.
digiwhite 06.02.2010 19:33 #
+ 0 -
Поставьте хотя бы тэг bash :).
Вместо того, чтобы говорить абстрактно, что оно «не работает», лучше бы показали какие выдаются ошибки.
Скрипт на чистом /bin/sh
Ну не у всех таки /bin/sh на /usr/bin/zsh ссылается. Скрипт, конечно, полезный. Но желательно указывать что на bash не работает
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Апр 25 11:55 /bin/sh -> bash
$ ccc 100 USD RUR
Updating currency database (/home/kstep/tmp/currencies.txt)...ok!
3119.42013722
$
УМВР, ЧЯДНТ?
У меня, кстати, и на zsh скрипт какую-то ошибку выдавал. Я его правил, но уже не помню где. Сейчас диффну.
Кстати, если придираться до конца: "на чистом /bin/sh" это как? Что есть "чистый /bin/sh"?
Ошибки:
./test.sh 100 USD RUR
/usr/bin/zsh: Нет такого файла или каталога
Исправляем на /bin/zsh (в арче):
работает
Далее, меняем на /bin/bash:
./test.sh: line 38: ${(U)2:-RUR}: bad substitution
./test.sh: line 39: ${(U)3:-USD}: bad substitution
(bash 4.1)
Исправляем:
FROMC=${(U)2:-RUR}
TOC=${(U)3:-USD}
на
FROMC=${2:-RUR}
TOC=${3:-USD}
Ну и ещё для косметики:
if < -n "$FDBF" >; then
else
на
if < ! -n "$FDBF" >; then
Ошибки:
./test.sh 100 USD RUR
/usr/bin/zsh: Нет такого файла или каталога
Исправляем на /bin/zsh (в арче):
работает
Далее, меняем на /bin/bash:
./test.sh: line 38: ${(U)2:-RUR}: bad substitution
./test.sh: line 39: ${(U)3:-USD}: bad substitution
(bash 4.1)
Исправляем:
FROMC=${(U)2:-RUR}
TOC=${(U)3:-USD}
на
FROMC=${2:-RUR}
TOC=${3:-USD}
Ну и ещё для косметики:
if < -n "$FDBF" >; then
else
на
if < ! -n "$FDBF" >; then
P.S. То что у вас работает на /bin/sh, слинкованном на /bin/bash - не удивительно, в скрипте явно прописан путь к интерпретатору zsh.
[kostett@localhost ~]$ ccc 7.90 eur rur
/usr/local/bin/ccc:20: parse error near `;'
ЧЯДНТ? zsh стоит. Arch Linux.
/usr/local/bin/ccc:20: parse error near `;'
ЧЯДНТ? zsh стоит. Arch Linux.