為替レート(FXレート)を取得・表示するシェルスクリプト(バッチ処理プログラム) ~ベース通貨、クォート通貨を自由に変更・指定してドル円、ユーロ円、ポンド円、豪ドル円、ユーロドルなどの現在値をインターネットから参照する方法~

AWS,EC2,Programming,Shell Script

AWS(Amazon Web Services)やGCP(Google Cloud Platform)などドル建てで請求が行われるパブリッククラウドサービスなどグローバル化が進み、様々な海外サービスが入ってきている近年ではFXなどの投資をしている人以外も為替レートが生活の消費に影響を直接与えるようになってきました。

現在、インターネット上では為替レートを参照できる様々なサービスがあり、中には秒単位でのリアルタイムの値を閲覧できるものもあります。

ただ、バッチ処理などで現在の外国通貨で現在の概算を計算する場合などシェルスクリプトで為替レートを扱いたい処理も存在します。

今回はインターネット上に公開されている為替レートに対してベース通貨、クォート通貨を自由に変更・指定して知りたい通貨の現在値を取得するシェルスクリプト(バッチ処理プログラム)を備忘録として記載します。

為替レート(FXレート)を取得・表示するシェルスクリプト(バッチ処理プログラム) ~ベース通貨、クォート通貨を自由に変更・指定してドル円、ユーロ円、ポンド円、豪ドル円、ユーロドルなどの現在値をインターネットから参照する方法~

基本方針としては「xurrency.com」で公開されている各国の為替レート情報から指定したベース通貨、クォート通貨で検索して対象の通貨の値を取得表示します。

また、ベース通貨、クォート通貨が同じ場合はその通貨をベース通貨とした主要通貨+αの一覧表を表示するようにしています。

為替レート(FXレート)を取得・表示するシェルスクリプト(バッチ処理プログラム)

シェルスクリプト(バッチ処理プログラム)の内容はベース通貨、クォート通貨の引数で公開されている為替レート情報から対象の通貨の値を取得しています。

引数がない場合は日本円をベース通貨とした主要通貨+αの一覧表を、2つの引数が同じ場合はその通貨をベース通貨とした主要通貨+αの一覧表を表示します。

下記の例で使用されている主要通貨+αは下記となります。
主要通貨:USD(米ドル) EUR(ユーロ) JPY(日本円) GBP(英ポンド) CHF(スイスフラン)
+α:AUD(豪ドル) CAD(カナダドル) CNY(人民元) SEK(スウェーデン・クローナ) MXNメキシコ・ペ() NZD(NZドル) ZAR(南アフリカランド) TWD(台湾 ドル) KRW(韓国ウォン) NOK(ノルウェイクローネ) THB(タイバーツ)

[root@localhost ~]# vim check_currency_rate.sh
#!/bin/bash

#ページ情報を保存する一時ディレクトリの指定
TMP_DIR=/tmp

#引数からベース通貨を設定
BASE=$1

#引数からクォート通貨を設定
QUOTE=$2

#ベース通貨がない場合はjpyを指定
if [ "${BASE}" = "" ]; then
  BASE=jpy
fi

#クォート通貨がない場合はjpyを指定
if [ "${QUOTE}" = "" ]; then
  QUOTE=jpy
fi

#公開されている為替情報を取得
CURRENCIES=`curl -sS https://xurrency.com/currencies | grep 'href' | grep 'title' | grep '://xurrency.com/' | sed 's/ //g' | sed 's/:\/\/xurrency.com\// /g' | sed 's/"http//g' | sed 's/"https//g' | sed 's/"/ /g' | awk '{print "[" $2 "]"}' | sort | uniq | tr -d '\n'`

#ベース通貨の文字列を小文字に変換
BASE=`echo "${BASE}" | tr 'A-Z' 'a-z'`
#クォート通貨の文字列を小文字に変換
QUOTE=`echo "${QUOTE}" | tr 'A-Z' 'a-z'`

#指定したベース通貨が公開為替情報に存在するかを確認
IS_BASE=`echo "$CURRENCIES" | grep "\[${BASE}\]" | wc -l | sed 's/ //g' | sed 's/\t//g' | tr -d '\n'`
if [ "${IS_BASE}" = "0" ]; then
  echo "The Base Currency is Invalid."
  echo "$CURRENCIES"
  exit 1
fi

#指定したクォート通貨が公開為替情報に存在するかを確認
IS_QUOTE=`echo "$CURRENCIES" | grep "\[${QUOTE}\]" | wc -l | sed 's/ //g' | sed 's/\t//g' | tr -d '\n'`
if [ "${IS_QUOTE}" = "0" ]; then
  echo "The Base Currency is Invalid."
  echo "$CURRENCIES"
  exit 1
fi

#クォート通貨の文字列を小文字に変換
QUOTE=`echo "${QUOTE}" | tr 'A-Z' 'a-z'`

#クォート通貨に対する値が存在する公開為替情報を取得
curl -sS https://xurrency.com/${QUOTE} > ${TMP_DIR}/get_currency_rate.txt

#ベース通貨の文字列を大文字に変換
BASE=`echo "${BASE}" | tr 'a-z' 'A-Z'`
echo "The Base Currency: ${BASE}"

#クォート通貨の文字列を大文字に変換
QUOTE=`echo "${QUOTE}" | tr 'a-z' 'A-Z'`
echo "The Quote Currency: ${QUOTE}"

#文字列置換に使用する改行コードを指定する。
LF=$'\\\x0A'

if [ "${BASE}" != "${QUOTE}" ]; then
  #ベース通貨とクォート通貨が違う場合は<クォート通貨>/<ベース通貨>の値をページ情報から取得して表示する。
  BASE=`echo "${BASE}" | tr 'a-z' 'A-Z'`
  RATE=`cat ${TMP_DIR}/get_currency_rate.txt | grep "${BASE}" | grep '^1' | grep 'abbr' | tail -n 1 | sed 's/[^0-9.]/'"$LF"'/g' | grep '^[0-9]' | sed 's/^\.//g' | sed 's/\.$//g' | sort -n | uniq | grep '^[0-9]*\.[0-9]*$'`

  echo "${BASE}/${QUOTE}: ${RATE}"
else
  #ベース通貨とクォート通貨が同じ場合は<MAJORSの配列に存在する通貨>/<ベース通貨>の値をページ情報からそれぞれ取得して表示する。
  MAJORS=(USD EUR JPY GBP AUD CAD CHF CNY SEK MXN NZD ZAR TWD KRW NOK THB)
  for MAJOR in ${MAJORS[@]}; do
    BASE=`echo "${MAJOR}" | tr 'a-z' 'A-Z'`
    if [ "${BASE}" != "${QUOTE}" ]; then
      RATE=`cat ${TMP_DIR}/get_currency_rate.txt | grep "${BASE}" | grep '^1' | grep 'abbr' | tail -n 1 | sed 's/[^0-9.]/'"$LF"'/g' | grep '^[0-9]' | sed 's/^\.//g' | sed 's/\.$//g' | sort -n | uniq | grep '^[0-9]*\.[0-9]*$'`

      echo "${BASE}/${QUOTE}: ${RATE}"
    else
      echo "${BASE}/${QUOTE}: 1"
    fi
  done
fi

#一時ディレクトリに存在する一時ページ情報を削除する。
rm -f ${TMP_DIR}/get_currency_rate.txt

為替レート(FXレート)を取得・表示するシェルスクリプト(バッチ処理プログラム)の使用例

引数に指定する通貨変えて下記を取得する例を記載しています。
引数[usd jpy]:USD/JPYの取得
引数[eur usd]:EUR/USDの取得
引数[無し]:<主要通貨+α>/JPYの取得
引数[usd usd]:<主要通貨+α>/USDの取得

[root@localhost ~]# chmod 755 check_currency_rate.sh
[root@localhost ~]# ./check_currency_rate.sh usd jpy
The Base Currency: USD
The Quote Currency: JPY
USD/JPY: 112.3596
[root@localhost ~]# ./check_currency_rate.sh eur usd
The Base Currency: EUR
The Quote Currency: USD
EUR/USD: 1.0613
[root@localhost ~]# ./check_currency_rate.sh
The Base Currency: JPY
The Quote Currency: JPY
USD/JPY: 112.3596
EUR/JPY: 120.4819
JPY/JPY: 1
GBP/JPY: 140.8451
AUD/JPY: 86.9565
CAD/JPY: 86.2069
CHF/JPY: 112.3596
CNY/JPY: 16.4474
SEK/JPY: 12.6904
MXN/JPY: 5.5218
NZD/JPY: 81.3008
ZAR/JPY: 8.6356
TWD/JPY: 3.6590
KRW/JPY: 0.0983
NOK/JPY: 13.5318
THB/JPY: 3.2279
[root@localhost ~]# get_currency_rate.sh usd usd
The Base Currency: USD
The Quote Currency: USD
USD/USD: 1
EUR/USD: 1.0613
JPY/USD: 0.0089
GBP/USD: 1.2405
AUD/USD: 0.7688
CAD/USD: 0.7661
CHF/USD: 0.9975
CNY/USD: 0.1458
SEK/USD: 0.1124
MXN/USD: 0.0489
NZD/USD: 0.7182
ZAR/USD: 0.0765
TWD/USD: 0.0324
KRW/USD: 0.0009
NOK/USD: 0.1199
THB/USD: 0.0286
Reference: Tech Blog citing related sources