출력을 명령으로 보유하는 다른 변수 내에 문자열 변수를 중첩하려면 어떻게 해야 합니까?

출력을 명령으로 보유하는 다른 변수 내에 문자열 변수를 중첩하려면 어떻게 해야 합니까?

출력을 명령으로 보유하는 다른 변수 내에 문자열 변수를 중첩하려면 어떻게 해야 합니까?

이 코드의 기능을 수행하고 싶습니다.

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표현식은 세 개의 문자열을 생성합니다. 각 문자열은 변수 할당입니다. @shin 연산자는 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 주위에 따옴표가 누락되었습니다.

관련 정보