You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

原脚本的问题分析

  1. 变量引用语法错误:在jq表达式里,"$updateKey"和"$updateValue"会被当成字面量字符串,而非外部传递的变量,正确写法是去掉双引号,直接使用$updateKey和$updateValue
  2. JSON数据传递错误:--arg会把JSON转成普通字符串,导致最终写入的是带引号的字符串而非JSON结构,应该用--argjson来传递JSON格式的数据
  3. 不必要的entries转换:不需要把对象转成entries再处理,jq支持直接通过键名修改值,.[$updateKey] = $updateValue就能直接更新指定字段
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:34:32