【问题标题】:passing arguments to jq filter将参数传递给 jq 过滤器
【发布时间】: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 保证生成语法有效的输出。

标签: json bash parameter-passing 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2012-07-29
    • 1970-01-01
    • 2013-08-17
    • 2018-04-14
    • 1970-01-01
    相关资源
    最近更新 更多