出力をコマンドとして保持する別の変数内に文字列変数を入れ子にするにはどうすればよいですか?
このコードの機能を実行したいと思います。
xmrprice=$(curl -s 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cbitcoin-cash%2Clitecoin%2Cmonero&vs_currencies=usd&include_market_cap=true' |jq -r '.monero'|jq -r '.usd')
echo "The price of Monero is $xmrprice"
btcprice=$(curl -s 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cbitcoin-cash%2Clitecoin%2Cmonero&vs_currencies=usd&include_market_cap=true' |jq -r '.bitcoin'|jq -r '.usd')
echo "The price of BTC is $btcprice"
ltcprice=$(curl -s 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cbitcoin-cash%2Clitecoin%2Cmonero&vs_currencies=usd&include_market_cap=true' |jq -r '.litecoin'|jq -r '.usd')
echo "The price of Litecoin is $ltcprice"
ところで3回も電話しませんでしたcurl
。この-s
フラグを削除すると、カールが実際に3回呼び出されたことを示します。出力から文字列を割り当てたい
curl -s https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cbitcoin-cash%2Clitecoin%2Cmonero&vs_currencies=usd&include_market_cap=true
変数にxmrprice
、およびそのbrcprice
値を抽出しますltcprice
。次のPythonコードと同じです。
#!/usr/bin/python3
#pip3 install requests
import requests
import json
result = requests.get("https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cbitcoin-cash%2Clitecoin%2Cmonero&vs_currencies=usd&include_market_cap=true", headers = {"accept":"application/json"})
print("Monero's and Bitcoin's prices as of now:")
print(str(result.json()["monero"]["usd"]))
print(str(result.json()["bitcoin"]["usd"]))
私は持っています入れ子になった変数についてこの質問が発生しました。Bashでは、複数のコマンドの入れ子になった出力を変数に割り当てることができます。
私はこれをすべて試しました:
response=$(curl -s https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cbitcoin-cash%2Clitecoin%2Cmonero&vs_currencies=usd&include_market_cap=true)
#xmrprice=(${response}|jq -r '.monero'|jq -r '.usd') #syntax error near unexpected token `|'
#xmrprice=("${response}"|jq -r '.monero'|jq -r '.usd') #syntax error near unexpected token `|'
#xmrprice=$("${response}"|jq -r '.monero'|jq -r '.usd') #{"error":"Missing parameter vs_currencies"}: command not found
#xmrprice=$("{response}"|jq -r '.monero'|jq -r '.usd') #: {response}: command not found
echo "The price of Monero is ${xmrprice}".
これらのどれも機能しません。このコメントは、Bash で発生したエラーを説明します。
ベストアンサー1
私はこれを行うことができます:
#!/bin/sh
unset -v xmrprice btcprice ltcprice
url='https://api.coingecko.com/endpoint/path'
eval "$(
curl -s "$url" |
jq -r '
@sh "xmrprice=\(.monero.usd|tonumber)",
@sh "btcprice=\(.bitcoin.usd|tonumber)",
@sh "ltcprice=\(.litecoin.usd|tonumber)"'
)"
printf '%s is %s\n' \
'xmrprice' "$xmrprice" \
'btcprice' "$btcprice" \
'ltcprice' "$ltcprice"
この呼び出しcurl
一度生成された文書を次に渡します。一つ jq
ファイルや変数に保存せずに呼び出されます。このjq
式は3つの文字列を生成します。各文字列は変数の割り当てです。@sh
in 演算子は、jq
文字列がシェルから正しく引用されることを保証します。
変数の割り当てが評価され、eval
3つのシェル変数が作成されます。
一重引用符でも二重引用符でも、コードで使用される引用符は偶然または不要ではありません(printf
単に表示するための最終パラメータの一般的な文字列の周りの一重引用符を除く)。
実際にシェル変数の作成に興味がない場合は、フォーマットされたjq
出力を実行するために使用できるため、これを行う必要はありません。
#!/bin/sh
url='https://api.coingecko.com/endpoint/path'
curl -s "$url" |
jq -r '
"xmrprice is at \(.monero.usd|tonumber) USD",
"btcprice is at \(.bitcoin.usd|tonumber) USD",
"ltcprice is at \(.litecoin.usd|tonumber) USD"'