출력을 명령으로 보유하는 다른 변수 내에 문자열 변수를 중첩하려면 어떻게 해야 합니까?
이 코드의 기능을 수행하고 싶습니다.
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"
그런데 세 번이나 전화를 안 했어요 curl
. 이 -s
플래그를 제거하면 컬이 실제로 세 번 호출되었음을 나타냅니다. 출력에서 문자열을 할당하고 싶습니다
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
표현식은 세 개의 문자열을 생성합니다. 각 문자열은 변수 할당입니다. @sh
in 연산자는 jq
문자열이 셸에서 올바르게 인용되도록 보장합니다.
변수 할당이 평가 되어 eval
세 개의 쉘 변수가 생성됩니다.
작은 따옴표든 큰 따옴표든 코드에 사용된 따옴표는 우연이거나 불필요한 것이 아닙니다( 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"'
답변2
당신은 당신이 찾고 있는 것에 가깝습니다. 당신은 단지 하나를 놓치고 있습니다 echo
.
#!/usr/bin/env 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=$(echo "${response}"|jq -r '.monero'|jq -r '.usd')
echo "${xmrprice}"
편집: Kusalananda가 지적했듯이 컬 명령의 URL 주위에 따옴표가 누락되었습니다.