Напишем bash скрипт для получения курса валюты доллара и евро по отношению к
рублю, и выведем их в i3status
В предыдущей статье мы настроили i3status и научились добавлять к нему свои собственные блоки. Теперь добавим к строке статуса текущие активные курсы интересующих нас валют.
Получать свежий курс валют будем с Центробанка по адресу
https://www.cbr-xml-daily.ru/daily_json.js
при помощи curl
в формате json.
i3status
не очень комфортно настраивать для показа результата каких - то своих
команд или работы своих скриптов. Приходится оборачивать его вызов в свой bash
скрипт, и модифицировать json. Скрипт в итоге будет вызываться с периодичностью,
заданной в конфигурационном файле. У меня это 1 секунда, и, конечно же, нет
никакой необходимости обновлять курсы валют так часто. Поэтому наш скрипт
будет сохранять результаты полученных курсов валют в файлы. Поставим скрипт
на выполнение по расписанию с помощью cron
с нужным интервалом,
а затем уже из файла мы можем выводить курсы валют с помощью штантого модуля
i3status File Contents (read_file).
Начнем с написания bash скрипта:
~/.config/i3status/currency.sh
#!/bin/bash
# контекст, директория хранения данных о курсах валют
contextPath="$HOME/.config/i3status/currency"
# файл json со всеми валютами, получаемыми из cbr
currencyJsonPath="${contextPath}/currency-cbr.json"
# обновление файла с json валют
function updateCurrencyCbr {
curl https://www.cbr-xml-daily.ru/daily_json.js > $currencyJsonPath
}
# получение значения переданной валюты
# из JSON файла cbr
# округленного до 2-х знаков после запятой
function getRoundedCurrency {
local currencyKey="$1"
value=`cat ${currencyJsonPath} | jq .Valute.$currencyKey.Value`
roundValue=`echo "scale=2;($value)/1" | bc`
echo $roundValue
}
# получение стрелки вниз (падение валюты)
# или вверх (рост валюты)
function getCurrencyArrow {
local currencyKey="$1"
value=`cat ${currencyJsonPath} | jq .Valute.$currencyKey.Value`
valuePrevious=`cat ${currencyJsonPath} | jq .Valute.$currencyKey.Previous`
# если курс не поменялся
if [[ `echo "$value==$valuePrevious" | bc` -eq 1 ]]; then
echo ""
# курс изменился в большую сторону
elif [[ `echo "$value>$valuePrevious" | bc` -eq 1 ]]; then
echo "↑"
# курс изменился в меньшую сторону
else
echo "↓"
fi
}
# сохранение значения переданной валюты
# и индикатора динамики изменения (стрелки) в отдельный файл
function saveCurrency {
local currencyKey="$1"
echo `getRoundedCurrency "$currencyKey"``getCurrencyArrow "$currencyKey"` > "$contextPath/$currencyKey"
}
### start ###
# создание директории, если не создана
mkdir -p "${contextPath}"
# обновление валют cbr
updateCurrencyCbr
# сохранение интересующих валют
saveCurrency "USD"
saveCurrency "EUR"
Исполним его:
~/.config/i3status/currency/currency.sh
В директории ~/.config/i3status/currency
появились файлы с подготовленными
для вывода файлами:
ls ~/.config/i3status/currency
currency-cbr.json currency.sh EUR USD
Нас интересуют файлы с сегодняшним курсом EUR
и USD
:
cat ~/.config/i3status/currency/EUR
78.44↑
cat ~/.config/i3status/currency/USD
71.88↑
С содержимым все в порядке, теперь поставим скрипт на выполнение по расписанию
в cron
. Курс на завтрашний день в ЦБ обновляется в 11:30, поэтому поставим
исполнение скрипта чуть позже на всякий случай, в 11:35, раз в сутки. Затем еще
раз, на всякий случай, через час, в 12:35.
crontab -e
35 11,12 * * * ~/.config/i3status/currency/currency.sh
По желанию можно поставить скрипт на выполнение при старте системы.
В i3wm
я это сделаю в конфигурационном файле i3 ~/.config/i3/config
exec --no-startup-id ~/.config/i3status/currency/currency.sh
Теперь при старте системы будет получен в фоне актуальный курс, а в 11.35 будет
обновлен. Осталось только вывести значение в i3status
. Отредактируем
конфигурационный файл ~/.config/i3status/config
, добавив туда блоки
File Contents (read_file), по одному на каждую валюту:
...
order += "read_file $"
order += "read_file €"
...
read_file $ {
path = "/home/igancev/.config/i3status/currency/USD"
format = "%title: %content"
}
read_file € {
path = "/home/igancev/.config/i3status/currency/EUR"
format = "%title: %content"
}
Вот и все. По аналогии можно добавить другие валюты, подсмотрев их код
в сохраняемом currency-cbr.json
.
Итог: при желании и некотором навыке в i3status
можно вывести много
полезной информации. Однако писать подобные скрипты, заботиться о своевременном
обновлении файлов, а также задействовать автозагрузку и cron
кажется не лучшим
решением. Возможно, если ваши потребности далеко выходят за рамки i3status
,
стоит задуматься об альтернативе. Например в i3blocks
можно задавать
команды каждому блоку напрямую, а также задавать из конфигурационного файла
период обновления. Но это уже тема для другой статьи.