Program Tip

bash 변수를 jq select에 전달

programtip 2020. 11. 4. 08:16
반응형

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 "--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')"

제 경우에는 변수 값에 액세스하기 위해 큰 따옴표와 따옴표를 사용해야했습니다.

건배.

참고URL : https://stackoverflow.com/questions/40027395/passing-bash-variable-to-jq-select

반응형