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

Bash中jq循环构建JSON数组丢失元素及添加数组键问题

问题分析与解决方案

元素丢失的原因

你每次循环里用>重定向写入文件时,都会覆盖之前的内容,而不是追加。循环三次后,最后一次生成的JSON对象会把前两次的内容完全覆盖,所以最终文件里只剩最后一个对象。

比如你原来的错误写法大概是这样:

while IFS= read -r name; do
  jq -n --arg name "$name" '{"name": $name}' > output.json
done < names.csv

每次循环都用>清空并写入新内容,自然留不住之前的对象。

正确实现方法(含secrets键)

不要每次循环单独写入文件,而是把所有生成的JSON对象统一收集后,一次性交给jq处理成带secrets键的数组。推荐用管道的方式,高效且简洁:

#!/bin/bash
# 读取names.csv每行,生成单个JSON对象,最后合并成带secrets键的数组
while IFS= read -r name; do
  # 生成单个{"name": "xxx"}对象
  jq -n --arg name "$name" '{"name": $name}'
done < names.csv | jq -s '{"secrets": .}' > output.json

代码说明:

  1. while IFS= read -r name:正确读取names.csv的每行内容,IFS=避免截断开头空格,-r避免反斜杠被转义。
  2. jq -n --arg name "$name" '{"name": $name}':生成单个JSON对象,-n表示从头构建新JSON,--arg把bash变量传递给jq。
  3. 管道| jq -s '{"secrets": .}':-s参数会把所有输入的单个JSON对象合并成一个数组,然后我们给这个数组套上secrets键,最后写入output.json。

处理后,output.json的最终格式会是:

{
  "secrets": [
    {"name": "第一个名称"},
    {"name": "第二个名称"},
    {"name": "第三个名称"}
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:54:59