将参数传递给 jq 过滤器
passing arguments to jq filter
这是我的 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
.
有人可以帮助我吗?
您示例中的 jq 程序 .dev.projects."$v"
将逐字尝试查找名为 "$v"
的键。请尝试以下操作:
jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json
当你制作 json 时,你也可以使用 --argjson
。
--arg a v # set variable $a to value <v>;
--argjson a v # set variable $a to JSON value <v>;
正如上面的评论中所问,有一种方法可以传递多个参数。
也许有更优雅的方法,但它确实有效。
- 如果您确定始终需要所有密钥,您可以使用此:
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'
当然可以组合这些!
你可以这样做:
key="dev.projects.prj1"
filter=".$key"
cat config.json | jq $filter
这是我的 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
.
有人可以帮助我吗?
您示例中的 jq 程序 .dev.projects."$v"
将逐字尝试查找名为 "$v"
的键。请尝试以下操作:
jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json
当你制作 json 时,你也可以使用 --argjson
。
--arg a v # set variable $a to value <v>;
--argjson a v # set variable $a to JSON value <v>;
正如上面的评论中所问,有一种方法可以传递多个参数。 也许有更优雅的方法,但它确实有效。
- 如果您确定始终需要所有密钥,您可以使用此:
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'
当然可以组合这些!
你可以这样做:
key="dev.projects.prj1"
filter=".$key"
cat config.json | jq $filter