태그 보관물: jq

jq

bash 변수를 jq에 전달 select하지만 변수가 작동하지

에서 특정 값을 검색하는 스크립트를 작성했습니다 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")