jq에 bash 변수 전달 중
특정 값을 취득하기 위해 스크립트를 작성했습니다.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=$(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 '"')
변수 값에 문자열을 추가하고 이스케이프된 큰따옴표를 사용하는 경우(예: 추가).crt
CERT_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
'programing' 카테고리의 다른 글
WordPress에서 "508 Resource Limit is reached" 오류를 수정하는 방법 (0) | 2023.03.05 |
---|---|
기존 SQL 데이터베이스 위에 탄력 검색을 사용하는 방법 (0) | 2023.03.05 |
Linux 서비스를 쓸 때 Exec 포맷 오류가 나타나는 이유는 무엇입니까? (0) | 2023.03.05 |
MongoDB 데이터베이스의 모든 항목 삭제 (0) | 2023.03.05 |
Spring Boot에서 Character Encoding Filter를 설정하는 방법 (0) | 2023.03.05 |