将 bash 变量传递给 jq
Passing bash variable to jq
我编写了一个脚本来从 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"
这是一个报价问题,您需要:
projectID=$(
cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)
如果用 单引号 分隔主字符串,shell 按字面意思 $EMAILID
。
"Double quote" 每个包含 spaces/metacharacters 和 每个 扩展的文字:"$var"
、"$(command "$var")"
、"${array[@]}"
, "a & b"
。使用 'single quotes'
作为代码或文字 $'s: 'Costs US'
、ssh host 'echo "$HOSTNAME"'
。参见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
我通过转义内部双引号解决了这个问题
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
考虑将 shell 变量 (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"
实现此目的的另一种方法是使用 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 }')"
现在我可以获取变量的内容并将其传递给 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。使用 jq 执行以下操作:
.items[] | select(.name=="string")
在bash你可以做到
EMAILID=
projectID=$(cat file.json | jq -r '.resource[] | select(.username=='\"$EMAILID\"') | .id')
基本上转义引号并将其传递给 jq
Jq现在有更好的方法来访问环境变量,你可以使用env.EMAILID
:
projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.EMAILID) | .id")
有点不相关,但我还是会把它放在这里,
出于其他实际目的,shell 变量可用作 -
value=10
jq '."key" = "'"$value"'"' file.json
如果我们想要将一些字符串附加到变量值并且我们使用转义双引号,例如将 .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\""
我也遇到了与 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 '"')
我编写了一个脚本来从 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"
这是一个报价问题,您需要:
projectID=$(
cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)
如果用 单引号 分隔主字符串,shell 按字面意思 $EMAILID
。
"Double quote" 每个包含 spaces/metacharacters 和 每个 扩展的文字:"$var"
、"$(command "$var")"
、"${array[@]}"
, "a & b"
。使用 'single quotes'
作为代码或文字 $'s: 'Costs US'
、ssh host 'echo "$HOSTNAME"'
。参见
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words
我通过转义内部双引号解决了这个问题
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
考虑将 shell 变量 (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"
实现此目的的另一种方法是使用 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 }')"
现在我可以获取变量的内容并将其传递给 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。使用 jq 执行以下操作:
.items[] | select(.name=="string")
在bash你可以做到
EMAILID=
projectID=$(cat file.json | jq -r '.resource[] | select(.username=='\"$EMAILID\"') | .id')
基本上转义引号并将其传递给 jq
Jq现在有更好的方法来访问环境变量,你可以使用env.EMAILID
:
projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.EMAILID) | .id")
有点不相关,但我还是会把它放在这里, 出于其他实际目的,shell 变量可用作 -
value=10
jq '."key" = "'"$value"'"' file.json
如果我们想要将一些字符串附加到变量值并且我们使用转义双引号,例如将 .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\""
我也遇到了与 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 '"')