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
代码说明:
while IFS= read -r name:正确读取names.csv的每行内容,IFS=避免截断开头空格,-r避免反斜杠被转义。jq -n --arg name "$name" '{"name": $name}':生成单个JSON对象,-n表示从头构建新JSON,--arg把bash变量传递给jq。- 管道
| jq -s '{"secrets": .}':-s参数会把所有输入的单个JSON对象合并成一个数组,然后我们给这个数组套上secrets键,最后写入output.json。
处理后,output.json的最终格式会是:
{ "secrets": [ {"name": "第一个名称"}, {"name": "第二个名称"}, {"name": "第三个名称"} ] }
内容的提问来源于stack exchange,提问作者Gapi
相关产品推荐
相关产品推荐

