将参数传递给jq过滤器

时间:2016-01-12 13:49:35

标签: json bash parameter-passing jq

这是我的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

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:32)

您示例中的jq程序.dev.projects."$v"将逐渐尝试查找名为"$v"的密钥。请尝试以下方法:

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 

答案 1 :(得分:7)

制作json时也可以使用--argjson

--arg a v   set variable $a to value <v>;
--argjson a v   set variable $a to JSON value <v>;

答案 2 :(得分:2)

正如上面评论中所提到的那样,有一种方法可以传递多个论点。 也许有一种更优雅的方式,但它有效。

  • 如果您确定所需的所有密钥都可以使用:
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'
  • 如果key有时会引用数组:
jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

当然你可以结合这些!

答案 3 :(得分:0)

您可以执行以下操作:


    key="dev.projects.prj1"
    filter=".$key"
    cat config.json | jq $filter