programing

jq에 bash 변수 전달 중

megabox 2023. 3. 5. 09:42
반응형

jq에 bash 변수 전달 중

특정 값을 취득하기 위해 스크립트를 작성했습니다.file.jsonjq에 값을 지정하면 동작합니다.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=$(jq -r --arg EMAILID "$EMAILID" '
        .resource[]
        | select(.username==$EMAILID) 
        | .id' file.json)

포스트스크립트

참고로 jq를 사용할 수도 있습니다.env환경변수에 액세스하기 위한 기능.예를 들어, 다음 일련의 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")

약간 관련이 없지만, 여기 다시 설명하겠습니다. 다른 실용적인 목적을 위해 셸 변수를 다음과 같이 사용할 수 있습니다.

value=10
jq  '."key" = "'"$value"'"' file.json

다른 사람에게 도움이 될 수 있기 때문에 여기에 게시하는 것.문자열에서는 따옴표를 jq에 전달해야 할 수 있습니다.jq를 사용하여 다음을 수행하려면:

.items[] | select(.name=="string")

할 수 있는 한

EMAILID=$1
projectID=$(cat file.json | jq -r '.resource[] | select(.username=='\"$EMAILID\"') | .id')

기본적으로 인용구를 피해 jq에 전달한다.

견적서 문제이므로 다음 사항이 필요합니다.

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는 환경변수에 더 나은 방법으로 액세스할 수 있게 되었습니다.env.EMAILID:

projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.EMAILID) | .id")

이를 위한 또 다른 방법은 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와 변수 치환에 대한 동일한 문제에 직면했습니다.나는 그것을 발견했다.--arg각 괄호와 함께 사용해야 하는 옵션입니다.[]그렇지 않으면 효과가 없을 거야아래에 예를 제시하겠습니다.

RUNNER_TOKEN=$(aws secretsmanager get-secret-value --secret-id $SECRET_ID | jq '.SecretString|fromjson' | jq --arg kt $SECRET_KEY -r '.[$kt]' | tr -d '"')

변수 값에 문자열을 추가하고 이스케이프된 큰따옴표를 사용하는 경우(예: 추가).crtCERT_TYPE 사항이 가 있을 입니다.;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

$ CERT_TYPE=client.reader
$ cat certs.json | jq -r ".\"${CERT_TYPE}\".crt" #### This will *not* work #####
$ cat certs.json | jq -r ".\"${CERT_TYPE}.crt\""

언급URL : https://stackoverflow.com/questions/40027395/passing-bash-variable-to-jq

반응형