将参数传递给 jq 过滤器
Posted
技术标签:
【中文标题】将参数传递给 jq 过滤器【英文标题】:passing arguments to jq filter 【发布时间】:2016-04-17 04:10:08 【问题描述】:这是我的 config.json:
"env": "dev",
"dev":
"projects" :
"prj1":
"dependencies": ,
"description": ""
这是我的 bash 命令:
PRJNAME='prj1'
echo $PRJNAME
jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json
jq '.dev.projects.prj1' config.json
输出:
prj1
null
"dependencies": ,
"description": ""
所以 $PRJNAME 是 prj1,但第一次调用只输出null
。
有人可以帮我吗?
【问题讨论】:
您是否尝试过删除$v
周围的"
?为什么不用shell来填写jq ".dev.projects.$PRJNAME" config.json
之类的变量?
@RamboRamon,使用 shell 填充变量容易出错——想想它是否包含需要转义的引号等字符。 jq
保证生成语法有效的输出。
【参考方案1】:
在您的示例中,jq 程序.dev.projects."$v"
将尝试查找名为"$v"
的键。请尝试以下方法:
jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json
【讨论】:
如果我想传递 2 个或更多参数怎么办?你能给我看看例子吗? 您可以通过多次使用--arg
指令来传递多个参数,如:jq --arg foo 1 --arg bar 2 -n '[$foo, $bar]'
是否可以在 arg 中传递多个组件?例如PRJNAME='.dev.projects.prj1' jq --arg v "$PRJNAME" '[$v]' config.json
。当然,该代码不起作用 - 它将 arg 转换为用方括号括起来的字符串,所以我猜它不喜欢点表示法......
从 [$v] 中删除 ''【参考方案2】:
您也可以在制作 json 时使用 --argjson
。
--arg a v # set variable $a to value <v>;
--argjson a v # set variable $a to JSON value <v>;
【讨论】:
在传递不想用引号括起来的数字或布尔值时,您需要使用argjson
。【参考方案3】:
正如上面评论中所问的,有一种方法可以传递多个参数。 也许有一种更优雅的方式,但它确实有效。
如果您确定始终需要所有密钥,您可以使用:jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '
如果不总是使用密钥,您可以这样做:
jq --arg key $k ' if key != "" then .[$key] else . end'
如果键有时引用数组:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'
当然你可以把这些结合起来!
【讨论】:
这只适用于一个 var,当我尝试两个 var 时它会失败: OUTPUT=$(cat test.json | jq --arg env $ENV --arg app $APP '.[$env ] .apps .[$app] .bar') .[$key |tonumber] 是我的诀窍,谢谢!【参考方案4】:你可以这样做:
key="dev.projects.prj1"
filter=".$key"
cat config.json | jq $filter
【讨论】:
以上是关于将参数传递给 jq 过滤器的主要内容,如果未能解决你的问题,请参考以下文章
如何将三个或多个参数传递给自定义模板标签过滤器 django?
通过 javascript 将复杂参数传递给 Web API 服务