我写了一个从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"

当前回答

Jq现在有更好的方法访问环境变量,你可以使用env。EMAILID:

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

其他回答

如果我们想将一些字符串附加到变量值,并且我们使用了转义的双引号,例如将.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\""

有点无关,但我还是把它放在这里, 出于其他实际目的,shell变量可以用作-

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

另一种实现方法是使用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

我通过转义内双引号解决了这个问题

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

我知道回信有点晚了,抱歉。但这对我有用。

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

在我的情况下,我需要使用双引号和引号来访问变量值。

欢呼。