에서 특정 값을 검색하는 스크립트를 작성했습니다 file.json
. jq에 값을 제공하면 작동 select
하지만 변수가 작동하지 않는 것 같습니다 (또는 사용 방법을 모릅니다).
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="myemail@hotmail.com") | .id')
echo "$projectID"
EMAILID=myemail@hotmail.com
#this does not work *** no value is printed
projectID=$(cat file.json | jq -r '.resource[] | select(.username=="$EMAILID") | .id')
echo "$projectID"
답변
또한 쉘 변수 (EMAILID)를 jq 변수로 전달하는 것을 고려하십시오 (여기에서는 설명을 위해 EMAILID도 있음).
projectID=$(cat file.json |
jq -r --arg EMAILID "$EMAILID" '
.resource[]
| select(.username==$EMAILID)
| .id')
추신
기록을 위해 또 다른 가능성은 env
환경 변수에 액세스 하기 위해 jq의 함수 를 사용하는 것 입니다. 예를 들어 다음 bash 명령 시퀀스를 고려하십시오.
EMAILID=foo@bar.com # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'
출력은 JSON 문자열입니다.
"foo@bar.com"
답변
내부 큰 따옴표를 이스케이프하여이 문제를 해결했습니다.
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
답변
견적 문제입니다. 다음이 필요합니다.
projectID=$(
cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)
당신이 넣을 경우 작은 따옴표를 주요 문자열을 구분하기 위해, 쉘은 소요 $EMAILID
그대로.
“큰 따옴표”공간 / 메타 문자 및 포함하는 모든 문자 그대로 모든 확장 : "$var"
, "$(command "$var")"
, "${array[@]}"
, "a & b"
. 사용 'single quotes'
코드 나 문자에 대한 $'s: 'Costs $5 US'
, ssh host 'echo "$HOSTNAME"'
. 참조
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words을
답변
다른 사람들에게 도움이 될 수 있으므로 여기에 게시하십시오. 문자열에서 따옴표를 jq에 전달해야 할 수도 있습니다. jq로 다음을 수행하려면 :
.items[] | select(.name=="string")
bash에서 당신은 할 수 있습니다
EMAILID=$1
projectID=$(cat file.json | jq -r '.resource[] | select(.username=='\"$EMAILID\"') | .id')
본질적으로 따옴표를 이스케이프하고 jq에 전달
답변
이를 수행하는 또 다른 방법은 jq “–arg”플래그를 사용하는 것입니다. 원래 예 사용 :
#!/bin/sh
#this works ***
projectID=$(cat file.json | jq -r '.resource[] |
select(.username=="myemail@hotmail.com") | .id')
echo "$projectID"
EMAILID=myemail@hotmail.com
# Use --arg to pass the variable to jq. This should work:
projectID=$(cat file.json | jq --arg EMAILID $EMAILID -r '.resource[]
| select(.username=="$EMAILID") | .id')
echo "$projectID"
이 솔루션을 찾은 곳은
https://github.com/stedolan/jq/issues/626입니다.
답변
회신 할 시간이 조금 늦다는 것을 알고 있습니다. 죄송합니다. 그러나 그것은 나를 위해 작동합니다.
export K8S_public_load_balancer_url="$(kubectl get services -n ${TENANT}-production -o wide | grep "ingress-nginx-internal$" | awk '{print $4}')"
이제 변수의 내용을 가져 와서 jq에 전달할 수 있습니다.
export TF_VAR_public_load_balancer_url="$(aws elbv2 describe-load-balancers --region eu-west-1 | jq -r '.LoadBalancers[] | select (.DNSName == "'$K8S_public_load_balancer_url'") | .LoadBalancerArn')"
제 경우에는 변수 값에 액세스하기 위해 큰 따옴표와 따옴표를 사용해야했습니다.
건배.
답변
Jq는 이제 환경 변수에 액세스하는 더 좋은 방법을 가지고 있으며 env.EMAILI를 사용할 수 있습니다.
projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.EMAILID) | .id")