将bash变量(字符串)作为jq参数传递给walk JSON对象

时间:2017-08-20 17:14:27

标签: json bash jq

这似乎是非常基本问题。我是JSON的新手,所以我为即将到来的facepalm做好了准备。

我有以下JSON文件(test-app-1.json):

"application.name": "test-app-1",
"environments": {
    "development": [
        "server1"
    ],
    "stage": [
        "server2",
        "server3"
    ],
    "production": [
        "server4",
        "server5"
    ]
}

目的是将其用作配置文件和输入验证的参考。

我正在使用bash 3.2并将使用jq 1.4最新版本)来阅读JSON。

问题: 我需要根据参数返回指定的JSON数组中的所有值。

示例:(文档和其他资源如何显示应该工作)

APPLICATION_ENVIRONMENT="developement"

jq --arg appenv "$APPLICATION_ENVIRONMENT" '.environments."$env[]"' test-app-1.json

如果执行,则返回null。这应该返回server1

显然,如果我指定明确匹配环境下的JSON数组的文本,它可以正常工作: jq 'environments.development[]' test-app-1.json返回:server1

限制:我坚持这个项目的jq 1.4。我在不同的机器上尝试了1.5中相同的操作,但结果相同null

我在这里做错了什么?

jq文档:https://stedolan.github.io/jq/manual/

1 个答案:

答案 0 :(得分:1)

您有三个问题 - 两个拼写错误和一个jq过滤器使用问题:

  • APPLICATION_ENVIRONMENT设置为development而不是developement
  • 始终如一地使用变量名称:如果您定义appenv,请使用$appenv,而不是$env
  • 使用.environments[$appenv]
  • 的地址

修复后,看起来像这样:

$ APPLICATION_ENVIRONMENT="development"
$ jq --arg appenv "$APPLICATION_ENVIRONMENT" '.environments[$appenv][]' test-app-1.json
"server1"