如何修复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
相关产品推荐
相关产品推荐

