asi*_*idd 76 bash json environment-variables 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"
Run Code Online (Sandbox Code Playgroud)
pea*_*eak 121
考虑将shell变量(EMAILID)作为jq变量传递(为了便于说明,这里也是EMAILID):
projectID=$(cat file.json |
jq -r --arg EMAILID "$EMAILID" '
.resource[]
| select(.username==$EMAILID)
| .id')
Run Code Online (Sandbox Code Playgroud)
为了记录,另一种可能性是使用jq的env
函数来访问环境变量.例如,考虑这个bash命令序列:
EMAILID=foo@bar.com # not exported
EMAILID="$EMAILID" jq -n 'env.EMAILID'
Run Code Online (Sandbox Code Playgroud)
输出是一个JSON字符串:
"foo@bar.com"
Run Code Online (Sandbox Code Playgroud)
Zai*_*aid 18
Posting it here as it might help others. In string it might be necessary to pass the quotes to jq. To do the following with jq:
.items[] | select(.name=="string")
Run Code Online (Sandbox Code Playgroud)
in bash you could do
EMAILID=$1
projectID=$(cat file.json | jq -r '.resource[] | select(.username=='\"$EMAILID\"') | .id')
Run Code Online (Sandbox Code Playgroud)
essentially escaping the quotes and passing it on to jq
asi*_*idd 17
我通过转义内部双引号解决了这个问题
projectID=$(cat file.json | jq -r ".resource[] | select(.username==\"$EMAILID\") | .id")
Run Code Online (Sandbox Code Playgroud)
小智 12
Jq 现在有更好的方法来访问环境变量,您可以使用env.EMAILID
:
projectID=$(cat file.json | jq -r ".resource[] | select(.username==env.EMAILID) | .id")
Run Code Online (Sandbox Code Playgroud)
这是一个报价问题,你需要:
projectID=$(
cat file.json | jq -r ".resource[] | select(.username=='$EMAILID') | .id"
)
Run Code Online (Sandbox Code Playgroud)
如果你用单引号来分隔主字符串,那么shell就是$EMAILID
字面意思.
"双引号"每一个包含空格/元字符和文字的每个:扩张"$var"
,"$(command "$var")"
,"${array[@]}"
,"a & b"
.使用'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
一点不相关,但我仍然会把它放在这里,出于其他实际目的,shell 变量可以用作 -
value=10
jq '."key" = "'"$value"'"' file.json
Run Code Online (Sandbox Code Playgroud)
实现此目的的另一种方法是使用 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"
Run Code Online (Sandbox Code Playgroud)
看到这里,这是我找到这个解决方案的地方:https : //github.com/stedolan/jq/issues/626