如何在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
相关产品推荐
相关产品推荐

