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

"双引号"每一个包含空格/元字符和每一个展开的文字:"$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。

"双引号"每一个包含空格/元字符和每一个展开的文字:"$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

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

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

我还遇到了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 '"')

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

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