我写了一个从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。使用jq执行以下操作:

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

在bash中你可以做到

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

本质上是转义引号并将其传递给jq

其他回答

把它贴在这里,可能会帮助到其他人。在字符串中,可能需要将引号传递给jq。使用jq执行以下操作:

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

在bash中你可以做到

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

本质上是转义引号并将其传递给jq

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

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"标志。 使用原示例:

#!/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

还可以考虑将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是必须与方括号[]一起使用的选项,否则它将不起作用。我给你下面的例子:

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