#!/usr/bin/env bash # Author: Alexander Epstein https://github.com/alexanderepstein unset base unset exchangeTo currentVersion="1.22.1" unset configuredClient currencyCodes=(AUD BGN BRL CAD CHF CNY CZK DKK EUR GBP HKD HRK HUF IDR ILS INR JPY KRW MXN MYR NOK NZD PHP PLN RON RUB SEK SGD THB TRY USD ZAR) ## This function determines which http get tool the system has installed and returns an error if there isnt one getConfiguredClient() { if command -v curl &>/dev/null; then configuredClient="curl" elif command -v wget &>/dev/null; then configuredClient="wget" elif command -v http &>/dev/null; then configuredClient="httpie" elif command -v fetch &>/dev/null; then configuredClient="fetch" else echo "Error: This tool reqires either curl, wget, httpie or fetch to be installed." >&2 return 1 fi } ## Allows to call the users configured client without if statements everywhere httpGet() { case "$configuredClient" in curl) curl -A curl -s "$@" ;; wget) wget -qO- "$@" ;; httpie) http -b GET "$@" ;; fetch) fetch -q "$@" ;; esac } checkValidCurrency() { if [[ "${currencyCodes[*]}" == *"$(echo "${@}" | tr -d '[:space:]')"* ]]; then echo "0" else echo "1" fi } ## Grabs the base currency from the user and validates it with all the possible currency ## types available on the API and guides user through input (doesnt take in arguments) getBase() { echo -n "What is the base currency: " read -r base base=$(echo $base | tr /a-z/ /A-Z/) if [[ $(checkValidCurrency $base) == "1" ]]; then unset base echo "Invalid base currency" getBase fi } ## Checks base currency from the user and validates it with all the possible currency ## types available on the API (requires argument) checkBase() { base=$1 base=$(echo $base | tr /a-z/ /A-Z/) if [[ $(checkValidCurrency $base) == "1" ]]; then unset base echo "Invalid base currency" exit 1 fi } ## Grabs the exchange to currency from the user and validates it with all the possible currency ## types available on the API and guides user through input (doesnt take in arguments) getExchangeTo() { echo -n "What currency to exchange to: " read -r exchangeTo exchangeTo=$(echo $exchangeTo | tr /a-z/ /A-Z/) if [[ $(checkValidCurrency $exchangeTo) == "1" ]]; then echo "Invalid exchange currency" unset exchangeTo getExchangeTo fi } ## Grabs the exchange to currency from the user and validates it with all the possible currency ## types available on the API (requires arguments) checkExchangeTo() { exchangeTo=$1 exchangeTo=$(echo $exchangeTo | tr /a-z/ /A-Z/) if [[ $(checkValidCurrency $exchangeTo) == "1" ]]; then echo "Invalid exchange currency" unset exchangeTo exit 1 fi } ## Get the amount that will be exchanged and validate that the user has entered a number (decimals are allowed) ## doesnt take in argument, it guides user through input getAmount() { echo -n "What is the amount being exchanged: " read -r amount if [[ ! "$amount" =~ ^[0-9]+(\.[0-9]+)?$ ]] then echo "The amount has to be a number" unset amount getAmount fi } ## Get the amount that will be exchanged ## validate that the user has entered a number (decimals are allowed and requires argument) checkAmount() { amount=$1 if [[ ! "$amount" =~ ^[0-9]+(\.[0-9]+)?$ ]] then echo "The amount has to be a number" unset amount exit 1 fi } checkInternet() { httpGet github.com > /dev/null 2>&1 || { echo "Error: no active internet connection" >&2; return 1; } # query github with a get request } ## Grabs the exchange rate and does the math for converting the currency convertCurrency() { exchangeRate=$(httpGet "https://api.exchangeratesapi.io/latest?base=$base" | grep -Eo "$exchangeTo\":[1-9.]*" | grep -Eo "[0-9.]*") > /dev/null if ! command -v bc &>/dev/null; then oldRate=$exchangeRate exchangeRate=$(echo $exchangeRate | grep -Eo "^[0-9]*" ) amount=$(echo $amount | grep -Eo "^[0-9]*" ) exchangeAmount=$(( $exchangeRate * $amount )) exchangeRate=$oldRate else exchangeAmount=$( echo "$exchangeRate * $amount" | bc ) fi cat <&2 exit 1 elif [[ $latestVersion == "" ]]; then echo "Error: no active internet connection" >&2 exit 1 else if [[ "$latestVersion" != "$currentVersion" ]]; then echo "Version $latestVersion available" echo -n "Do you wish to update $repositoryName [Y/n]: " read -r answer if [[ "$answer" == [Yy] ]]; then cd ~ || { echo 'Update Failed'; exit 1; } if [[ -d ~/$repositoryName ]]; then rm -r -f $repositoryName || { echo "Permissions Error: try running the update as sudo"; exit 1; } ; fi echo -n "Downloading latest version of: $repositoryName." git clone -q "https://github.com/$githubUserName/$repositoryName" && touch .BSnippetsHiddenFile || { echo "Failure!"; exit 1; } & while [ ! -f .BSnippetsHiddenFile ]; do { echo -n "."; sleep 2; };done rm -f .BSnippetsHiddenFile echo "Success!" cd $repositoryName || { echo 'Update Failed'; exit 1; } git checkout "v$latestVersion" 2> /dev/null || git checkout "$latestVersion" 2> /dev/null || echo "Couldn't git checkout to stable release, updating to latest commit." chmod a+x install.sh #this might be necessary in your case but wasnt in mine. ./$nameOfInstallFile "update" || exit 1 cd .. rm -r -f $repositoryName || { echo "Permissions Error: update succesfull but cannot delete temp files located at ~/$repositoryName delete this directory with sudo"; exit 1; } else exit 1 fi else echo "$repositoryName is already the latest version" fi fi } usage() { cat <&2 exit 1 ;; h) usage exit 0 ;; v) echo "Version $currentVersion" exit 0 ;; u) checkInternet || exit 1 # check if we have a valid internet connection if this isnt true the rest of the script will not work so stop here update exit 0 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done if [[ $# == 0 ]]; then checkInternet || exit 1 # check if we have a valid internet connection if this isnt true the rest of the script will not work so stop here getBase # get base currency getExchangeTo # get exchange to currency getAmount # get the amount to be converted convertCurrency # grab the exhange rate and perform the conversion exit 0 elif [[ $# == "1" ]]; then if [[ $1 == "update" ]]; then update elif [[ $1 == "help" ]]; then usage else echo "Not a valid argument" usage exit 1 fi elif [[ $# == "2" ]]; then echo "Not a valid argument" usage exit 1 elif [[ $# == "3" ]]; then checkInternet || exit 1 # check if we have a valid internet connection if this isnt true the rest of the script will not work so stop here checkBase $1 checkExchangeTo $2 checkAmount $3 convertCurrency exit 0 else echo "Error: too many arguments." fi