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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:11:00