繁体   English   中英

将 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"

还考虑传入 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"

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

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

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

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

在 bash 你可以做

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

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

一点不相关,但我仍然会把它放在这里,出于其他实际目的,shell 变量可以用作 -

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

这是一个报价问题,您需要:

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

如果用单引号分隔主字符串,shell 会$EMAILID字面意思接收$EMAILID

“双引号”包含空格/元字符和每个扩展的每个文字: "$var""$(command "$var")""${array[@]}""a & b" 对代码或文字$'s: 'Costs $5 US'使用'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 "--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

Jq 现在有更好的方法来访问环境变量,您可以使用env.EMAILID

projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.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')"

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

干杯。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM