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

如何修复Bash脚本中循环修改JSON文件counter键的无效代码

问题

现有如下JSON文件(config.json):

{
  "A": {
    "i": "user_defined",
    "j": 678,
    "k": 1.75,
    "l": 6.7,
    "m": 1.2
  },
  "W": "10",
  "counter": {
    "0": {
      "p": 34,
      "q": "returned",
      "r": 98,
      "s": "wait",
      "t": "done",
      "u": "8.9"
    }
  },
  "z": "th"
}

需要执行10轮循环,每轮将counter中的键(初始为0)替换为当前轮次编号(1到10),每轮用修改后的JSON覆盖原文件。例如第1轮修改后counter的键为"1",第8轮为"8"。

尝试了以下脚本但无效果:

#!/bin/bash

# Read initial JSON content from file
initial_json=$(cat config.json)

# Loop for 10 rounds
for round in {1..10}; do
  # Modify JSON content
  modified_json=$(echo "$initial_json" | jq --argjson round "$round" '.counter = {($round|tostring): .counter."0"}')

  # Write modified JSON back to the file
  echo "$modified_json" > config.json

  echo "Round $round: JSON updated"
done
解决方案

脚本无效的核心问题有两个:一是每次循环都基于初始JSON修改,而非读取上一轮更新后的文件内容;二是轮次超过1后,counter里已无"0"键,.counter."0"会返回null,导致后续修改失效。

修复后的脚本如下:

#!/bin/bash

# Loop for 10 rounds
for round in {1..10}; do
  # 读取当前文件最新内容,提取counter下的唯一值,替换为当前轮次为键的新对象
  jq --argjson round "$round" '
    .counter = {
      ($round|tostring): (.counter | to_entries[0].value)
    }
  ' config.json > temp.json && mv temp.json config.json

  echo "Round $round: JSON updated"
done

关键修改说明

  • 读取最新文件状态:不再提前缓存初始JSON,每次循环直接读取config.json的当前内容,保证基于上一轮的修改继续操作。
  • 动态获取counter内容:用.counter | to_entries[0].value提取counter对象下的唯一值,不依赖固定的"0"键,适配每轮的键变化。
  • 避免写入冲突:用临时文件中转jq的输出,再替换原文件,防止读写同时操作导致的内容损坏。

内容的提问来源于stack exchange,提问作者Bsh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:04:54