使用 shell 在 jSON 对象中动态添加键值对

Dynamically add key value pair in jSON object using shell

我有一个名为 version6json 的 json 对象,如下所示

{
  "20007.098": {
    "os_version": "6.9",
    "kernel": "2.6.32-696",
    "sfdc-release": "2017.08"
  },
  "200907.09678”: {
    "os_version": "6.9",
    "kernel": "2.6.32-696",
    "sfdc-release": "201.7909"
  },
  "206727.1078”: {
    "os_version": "6.9",
    "kernel": "2.6.32-696.10.2.el6.x86_64",
    "sfdc-release": "20097.109”
  }
}

我想再添加一对键值对。键也是一个变量,值也是。 bundle_release="2019.78" and value= {"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true} 现在我想要 bundle_release 作为键和值作为它的值,所以新条目将是 "2018.1006": {"release":"2018.1006","kernel":"2.6.32-754.3 .5.el6.x86_64","os":"6.10","current":true}

为此,我正在执行以下操作

echo "$version6json" | jq --arg "$bundle_release" "$value" '. + {$bundle_release: "${value}"}'

我们将不胜感激。

P.S-问题已按照peak

的建议进行编辑

首先,当按照您的方式使用变量指定键名时,变量必须用括号括起来,因此您将:

 {($bundle_release): ...}

接下来,jq 变量与 shell 变量不同,应该在不引用它们的情况下指定,并且不使用 bash-isms。

第三,当设置名为 value 的 shell 变量的值时,您必须适当地引用表达式。

第四,为了简化事情,用--argjson代替$value

第五,你的样本JSON不太对。修复后,以下内容将在 bash 或 bash 类环境中工作(假设您使用的是支持 --argjson 的 jq 版本):

bundle_release="1034,567"
value='{"release":"2018.1006","kernel":"2.6.32-754.3.5.el6.x86_64","os":"6.10","current":true}'

jq --arg b "$bundle_release" --argjson v "$value"  '
  . + {($b): $v}' <<< "$version6json"

您没有为 --arg 选项提供足够的参数:来自手册:

--arg name value:

This option passes a value to the jq program as a predefined variable. If you run jq with --arg foo bar, then $foo is available in the program and has the value "bar". Note that value will be treated as a string, so --arg foo 123 will bind $foo to "123".