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

如何通过Bash脚本动态更新JSON对象并放回原JSON数组

Bash脚本中动态更新JSON数组指定对象的方法

要在Bash中不依赖索引,通过Name=John的筛选条件更新JSON数组对应对象,必须使用jq工具(这是Bash环境下处理JSON的标准工具,需提前安装)。以下是具体实现步骤:

1. 定义初始变量与修改后的对象

假设你的初始JSON数组变量为:

test='[{"Name":"John","Pet":"dog"},{"Name":"Alice","Pet":"cat"},{"Name":"John","Pet":"fish"}]'

已经准备好的修改后对象:

new_obj='{"Name":"Tom","Pet":"rabbit"}'

2. 执行更新操作

使用jq的条件替换逻辑,遍历数组并替换所有符合Name=John的对象:

test=$(echo "$test" | jq --argjson new "$new_obj" '.[] |= (if .Name == "John" then $new else . end)')

3. 关键语法解释

  • --argjson new "$new_obj":将Bash变量中的JSON对象传递给jq作为内部变量$new
  • .[] |= ...:遍历数组中的每个元素,并对元素执行后续的条件赋值
  • if .Name == "John" then $new else . end:判断当前元素的Name字段是否为John,是则替换为新对象,否则保持原元素不变

4. 仅替换第一个匹配对象的扩展方案

如果数组中存在多个Name=John的对象,且只需要替换第一个匹配项,可使用以下jq表达式:

test=$(echo "$test" | jq --argjson new "$new_obj" '
  . |= (
    reduce .[] as $item ([];
      if (length == 0 or (last.Name != "John" and $item.Name != "John")) then
        . + [$item]
      elif (last.Name != "John" and $item.Name == "John") then
        . + [$new]
      else
        . + [$item]
      end
    )
  )
')

5. 验证结果

执行完更新命令后,通过以下命令查看更新后的JSON数组:

echo "$test"

内容的提问来源于stack exchange,提问作者devops-admin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:05:47