Macos jq:通过shell变量追加JSON对象

Macos jq:通过shell变量追加JSON对象,macos,shell,zsh,jq,Macos,Shell,Zsh,Jq,我有一个JSON文件,我正在尝试向其中添加另一个字段 JSON文件示例: 看看其他答案,+=似乎有效: objectName="objName" cat $jsonFile | jq --arg objName $objectName '.data[$objName] += {"test": "json"}' 输出 { "data": { "objName": { &qu

我有一个JSON文件,我正在尝试向其中添加另一个字段

JSON文件示例:

看看其他答案,
+=
似乎有效:

objectName="objName"
cat $jsonFile | jq --arg objName $objectName '.data[$objName] += {"test": "json"}'
输出

{
  "data": {
    "objName": {
      "test": "json"
    }
  }
}
正如所料

问题是我不能硬编码JSON,所以我将字符串作为变量输入。但我无法使用语法:

objectName="objName"
objJSON='{"test": "json"}'
cat $jsonFile | jq -r --arg objName $objectName --arg jsonString $objJSON '.data[$objName] += $jsonString'
我在第1行:“json”}处收到错误
jq:error:syntax error,意外的无效字符,期望$end(Unix shell引用问题?)

  • 传递JSON而不是字符串时,请使用
    --argjson
    而不是
    --arg

  • 当有疑问时,引用字符串;这样,如果执行代码的shell不是您认为的shell,那么您的值就不会被篡改。(保持编写可移植代码的必要习惯也很有帮助;我在2000年代中期花了6个月的时间学习zsh之后放弃它的全部原因是我在为其他shell编写代码时的代码质量受到了影响)


  • …正确地发射:

    {
      "data": {
        "objName": {
          "test": "json"
        }
      }
    }
    

    嗯,有了这个,我得到了
    jq:invalid JSON text传递给--argjson Use jq--help获取命令行选项的帮助
    objJSON='{“test”:“JSON”}
    等等,我想我的JSON的大写形式不同于你的srun
    set-x
    ,告诉你的shell启用跟踪,这样你就可以看到它实际传递的参数了。让我们来看看。
    objName="objName"
    objJSON='{"test": "json"}'
    echo '{"data":{}}' |
      jq --arg     objectName "$objName" \
         --argjson jsonString "$objJSON" \
        '.data[$objectName] += $jsonString'
    
    {
      "data": {
        "objName": {
          "test": "json"
        }
      }
    }