如何在Bash中将字典记录追加为JSON数组写入option.json
生成合法JSON数组的Shell脚本修改方案
问题背景
需要遍历Shell字典MYMAP,将条目写入option.json并组成标准JSON数组。当前代码生成的内容缺少数组包裹,不符合JSON格式要求。
原代码
for K in "${!MYMAP[@]}"; do opt="{ \"OptionName\":\"${K}\", \"Value\":\"${MYMAP[$K]}\" }," echo $opt >> option.json done
原生成的JSON内容
{ "OptionName": "name", "Value": "test" }, { "OptionName": "age", "Value": "13" }
目标JSON格式
[ { "OptionName": "name", "Value": "test" }, { "OptionName": "age", "Value": "13" } ]
修改方案
以下两种方式均可实现需求,解决数组包裹和末尾逗号的问题:
方式一:利用数组收集元素后拼接
# 清空文件并写入数组起始符号 echo "[" > option.json # 遍历字典,将每个JSON对象存入数组 items=() for K in "${!MYMAP[@]}"; do item=$(cat <<EOF { "OptionName": "${K}", "Value": "${MYMAP[$K]}" } EOF ) items+=("$item") done # 用逗号分隔所有对象,移除最后一行的多余逗号后写入文件 printf "%s,\n" "${items[@]}" | sed '$ s/,$//' >> option.json # 写入数组结束符号 echo "]" >> option.json
方式二:通过计数判断末尾元素
# 清空文件并写入数组起始符号 echo "[" > option.json # 获取字典条目总数 total=${#MYMAP[@]} index=1 for K in "${!MYMAP[@]}"; do # 生成格式化的JSON对象 opt=$(cat <<EOF { "OptionName": "${K}", "Value": "${MYMAP[$K]}" } EOF ) # 最后一个元素不加逗号 if [ $index -eq $total ]; then echo "$opt" >> option.json else echo "$opt," >> option.json fi index=$((index+1)) done # 写入数组结束符号 echo "]" >> option.json
说明
- 两种方式均先写入数组开头
[,最后写入结尾],完成数组包裹 - 解决了原代码中
echo $opt导致的缩进丢失问题,使用cat <<EOF保留格式化排版 - 处理了末尾元素的逗号问题,避免生成非法JSON
内容的提问来源于stack exchange,提问作者tanfei12345
相关产品推荐
相关产品推荐

