如何用jq将指定分支JSON的Employes内容更新到branches.json?
解决jq更新branches.json指定分支字段的问题
我看了你的脚本,问题主要出在jq变量引用的语法错误和JSON数据传递方式不对这两点上,下面给你修正后的脚本,以及详细的问题分析:
修正后的脚本
#!/bin/sh # 使用示例:./update.sh branch2 set -xe branchName=$1 fullPath=$(pwd)/"$1.json" # 直接提取目标JSON结构,用--argjson传递完整JSON数据 branchDetails=$(cat "$fullPath" | /usr/local/bin/jq '.Employes') # 让jq直接输出到结果文件,避免echo破坏JSON格式 /usr/local/bin/jq --arg updateKey "$branchName" --argjson updateValue "$branchDetails" ' .[$updateKey] = $updateValue ' branches.json > results.json
原脚本的问题分析
- 变量引用语法错误:在jq表达式里,
"$updateKey"和"$updateValue"会被当成字面量字符串,而非外部传递的变量,正确写法是去掉双引号,直接使用$updateKey和$updateValue - JSON数据传递错误:
--arg会把JSON转成普通字符串,导致最终写入的是带引号的字符串而非JSON结构,应该用--argjson来传递JSON格式的数据 - 不必要的entries转换:不需要把对象转成entries再处理,jq支持直接通过键名修改值,
.[$updateKey] = $updateValue就能直接更新指定字段 - echo输出JSON的格式问题:
echo $newJson会丢失JSON里的换行和部分空格,导致格式错乱,直接让jq输出到文件更可靠
验证效果
假设你的branch2.json内容是:
{ "Employes": [ { "Name": "Ken", "age": "40" }, { "Name": "Frank", "age": "23" } ] }
执行./update.sh branch2后,results.json会正确更新branch2字段:
{ "branch1": [ { "Name": "Ikon", "age": "30" }, { "Name": "Lenon", "age": "35" } ], "branch2": [ { "Name": "Ken", "age": "40" }, { "Name": "Frank", "age": "23" } ] }
如果需要直接覆盖原branches.json,可以把输出改成> branches.json,不过建议先输出到结果文件验证后再替换原文件。
内容的提问来源于stack exchange,提问作者yarlg
相关产品推荐
相关产品推荐

