我写了一个从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变量可以用作-

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

其他回答

这是一个引用问题,你需要:

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

如果您使用单引号来分隔主字符串,shell将逐字接受$EMAILID。

"双引号"每一个包含空格/元字符和每一个展开的文字:"$var", "$(命令"$var")", "${array[@]}", "a & b"。使用“单引号”作为代码或文字$'s: 'Costs $5 US', ssh主机'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现在有更好的方法访问环境变量,你可以使用env。EMAILID:

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

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

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