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

如何在Bash中将关联数组转换为指定KV键值对结构的JSON

Bash关联数组转目标JSON结构方案

调整后完整代码(jo版本,最简洁)

#!/bin/bash

declare -A rep_hostname
# 如果需要test1对应值为172.1.1,直接修改这里的数组值即可
rep_hostname=( [test1]='172.1.1.1' [test2]='172.1.1.2' [test3]='172.1.1.3' )

# 构造jo所需的键值对参数列表
jo_args=()
for key in "${!rep_hostname[@]}"; do
  jo_args+=("$key=${rep_hostname[$key]}")
done

# 直接生成目标结构JSON
json=$(jo "${jo_args[@]}")

echo "$json"

原代码问题说明

  • 原代码额外加了members外层字段包装,不符合无嵌套的目标结构要求
  • 原代码只提取了关联数组的所有值${rep_hostname[@]},丢失了关联数组的键名信息,还转换成了数组结构,自然无法生成键值对应的目标结构

可选jq版本(无需依赖jo)

如果环境没有安装jo,可以直接用jq实现:

#!/bin/bash

declare -A rep_hostname
rep_hostname=( [test1]='172.1.1.1' [test2]='172.1.1.2' [test3]='172.1.1.3' )

json=$(
  for key in "${!rep_hostname[@]}"; do
    printf '%s\0%s\0' "$key" "${rep_hostname[$key]}"
  done | jq -sR 'split("\u0000") | . as $arr | reduce range(0; length-1; 2) as $i ({}; .[$arr[$i]] = $arr[$i+1])'
)

echo "$json"

运行两种方案都会输出符合要求的结构:

{
  "test1": "172.1.1.1",
  "test2": "172.1.1.2",
  "test3": "172.1.1.3"
}

如果需要test1的值为172.1.1,直接修改关联数组中test1对应的取值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:36:01