如何将JSON对象的键值对存入Bash关联数组?
如何将JSON对象转换为Bash关联数组
问题分析
你之前的jq命令报错是因为操作顺序错误:先执行to_entries将整个JSON结构转为数组后,再试图用字符串.deploymentEnvs索引数组,而数组仅支持数字索引,因此触发Cannot index array with string "deploymentEnvs"错误。
解决方法
需要先定位到目标JSON对象deploymentEnvs,再将其转为键值对条目,最后结合Bash的while循环填充关联数组。
完整实现代码
# 初始化Bash关联数组 declare -A deployenvs # 通过jq解析JSON,并用循环填充数组 while read -r key value; do deployenvs["$key"]="$value" done < <(jq -r '.deploymentEnvs | to_entries[] | "\(.key) \(.value)"' deploy.json) # 可选:验证数组内容 for key in "${!deployenvs[@]}"; do echo "deployenvs[$key]=${deployenvs[$key]}" done
关键部分说明
jq命令解析
.deploymentEnvs:先定位到JSON中的目标对象to_entries[]:将对象转换为键值对条目(例如{"key":"dev","value":"zone_dev"})"\(.key) \(.value)":将每个条目格式化为空格分隔的字符串,方便Bash读取
while循环逻辑
read -r key value:读取jq输出的每一行,将空格分隔的两个字段分别存入变量key和value- 进程替换
< <(...):将jq的输出作为循环的输入,避免子shell导致数组无法被外部访问
验证效果
执行上述代码后,关联数组deployenvs会被正确填充,输出验证内容将和你期望的结果一致:
deployenvs[dev]="zone_dev" deployenvs[test]="zone_test" deployenvs[prod]="zone_prod"
内容的提问来源于stack exchange,提问作者mdailey77
相关产品推荐
相关产品推荐

