Видео ролики бесплатно онлайн

Смотреть 4k видео

Официальный сайт osinform 24/7/365

Смотреть видео бесплатно

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 дня.

Сам скрипт:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/zsh

DBFILE=$HOME/tmp/currencies.txt
CCURL=http://www.cbr.ru/scripts/XML_daily.asp
FETCH=/usr/bin/wget

get_currency_data() {
grep ^$1 $DBFILE | cut -d ' ' -f 2,3
}

fetch_database_file() {
TMPFILE=`mktemp -t ccc.XXXXX`
if $FETCH -qO $TMPFILE $CCURL; then
awk -F"<<>>" '/<CharCode>(<a-z>+)<\/CharCode>/ { charcode=$3 } /<Nominal>(<0-9>+)<\/Nominal>/ { nominal=$3 } /<Value>(<0-9,>+)<\/Value>/ { sub(/\,/,".",$3); value=$3 } /<\/Valute>/ { print charcode,nominal,value }' < $TMPFILE > $DBFILE && rm -f $TMPFILE
else
return 1
fi
}

if < x$1 = x >; then
echo
echo Currency course converter, uses data from http://cbr.ru/.
echo
echo Usage:
echo " `basename $0` <sum to convert> <currency of the sum> <currency of result>"
echo
echo Simple text database is stored in $DBFILE and is automatically updated
echo from cbr.ru if this file is older than 1 day \(or is retrieved if absent\).
echo
echo Currency names must be international 3 chars currency codes
echo \(e.g. USD for dollars, EUR for euro, RUR for rubble etc.\).
echo Case is not important \("usd", "Usd" and "USD" - all mean the same\).
echo
exit
fi

SUM=$1
FROMC=${(U)2:-RUR}
TOC=${(U)3:-USD}

< "$FROMC" = "$TOC" > && exit 1

< -z "$SUM" > && exit 1

FDBF=`find $DBFILE -mtime -1 2> /dev/null`
if < -n "$FDBF" >; then
else
echo -n Updating currency database \($DBFILE\)... >&2
fetch_database_file && echo ok! >&2 || echo error! >&2
fi

if < ! -f $DBFILE >; then
echo Can not fetch currencies database from cbr.ru! >&2
exit 1
else
touch $DBFILE
fi

if < "$FROMC" = "RUR" >; then
CFGC=`get_currency_data $TOC`
OP="*"
elif < "$TOC" = "RUR" >; then
CFGC=`get_currency_data $FROMC`
OP="/"
else
CFGC="`get_currency_data $FROMC` / / `get_currency_data $TOC`"
OP="*"
fi

dc -e "8k $SUM $CFGC / $OP p"
</a-z>



Подробности реализации:

Использует замечательный стековый калькулятор dc (тогда была потребность в изучении чего-то нового).
Пример его работы:
dc -e "6 3 / p" => поделить 6 на 3 и вывести результат (p)
проще всего читать в стиле магистра Йоды: «6 на 3 поделить (/) и печатать ((p)rint)»
Подробнее читайте мануалы: полное его описание выходит за рамки короткой статьи.

Ещё один момент «магии»: проверка на необходимость обновления локальной «базы данных» валют.
Делается командой
FDBF=`find $DBFILE -mtime -1 2> /dev/null`
То есть ищется файл с базой данных, модифицированный менее 1 дня назад.
Тут варианта два: либо файл реально есть, но модифицирован (т.е. обновлён) более дня назад, и значит его надо обновить,
либо файла нет, потёр его кто-то или скрипт запущен первый раз, и значит его надо создать.
В любом из таких случаев find не найдёт этот файл и мы узнаем, что его нужно перегенерить.


Тэги: bash курсы валют скрипт
+ 6 -
Похожие Поделиться

digiwhite 06.02.2010 19:33 #
+ 0 -
Поставьте хотя бы тэг bash :).
kstep 06.02.2010 21:09 #
+ 0 -
Упс =) Так торопился, что забыл про теги =) Fixed.
vyazovoi 05.05.2010 12:15 #
+ 0 -
Зачем? О на bash'е без правки не работает.
digiwhite 06.05.2010 00:31 #
+ 0 -
Ну да, это я малек ступил. Ну смысл был ясен. Тэги-с.
kstep 02.07.2010 20:36 #
+ 0 -
Вместо того, чтобы говорить абстрактно, что оно «не работает», лучше бы показали какие выдаются ошибки.
vyazovoi 03.07.2010 07:25 #
+ 0 -
Зачем мне это?
kstep 13.09.2010 20:35 #
+ 0 -
Чтобы их можно было исправить.
vyazovoi 05.05.2010 12:17 #
+ 0 -
Скрипт на чистом /bin/sh


Ну не у всех таки /bin/sh на /usr/bin/zsh ссылается. Скрипт, конечно, полезный. Но желательно указывать что на bash не работает
kstep 02.07.2010 20:35 #
+ 0 -

$ 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
$


УМВР, ЧЯДНТ?
vyazovoi 03.07.2010 07:27 #
+ 0 -
У меня, кстати, и на zsh скрипт какую-то ошибку выдавал. Я его правил, но уже не помню где. Сейчас диффну.
vyazovoi 03.07.2010 07:38 #
+ 0 -
Кстати, если придираться до конца: "на чистом /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
vyazovoi 03.07.2010 07:41 #
+ 0 -
P.S. То что у вас работает на /bin/sh, слинкованном на /bin/bash - не удивительно, в скрипте явно прописан путь к интерпретатору zsh.
[email protected] 17.03.2014 13:35 #
+ 0 -
[kostett@localhost ~]$ ccc 7.90 eur rur
/usr/local/bin/ccc:20: parse error near `;'

ЧЯДНТ? zsh стоит. Arch Linux.
dront78 17.03.2014 16:33 #
+ 0 -
фига се /bin/sh
так можно и питон за него выдать ;)

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн