将参数传递给 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