首页 > 解决方案 > 将 JSON 字典转换为 Bash 字典?

问题描述

我正在尝试将 aws-cli 命令的输出接收到 Bash 中,并将其用作第二个的输入。我用这个有用的答案成功地将输出保存到变量中:

iid=$(aws ec2 run-instances ...)

并接收这样的输出:

{ "ImageId": "ami-0abcdef1234567890", "InstanceId": "i-1231231230abcdef0", "InstanceType": "t2.micro", ... }

我知道自 v4 以来的 Bash支持关联数组,但我正在努力将一个转换为一个。

我试图在 Bash 中解析字典但收到错误:

分配关联数组时必须使用下标

这是因为Bash dicts 的正确键语法是=, not :

最后,我通过sed使用这个奇妙的答案来访问成员:

echo $iid|sed 's/{//g;s/}//g;s/"//g'|cut -d ':' -f2

我的问题:除了正则表达式之外,还有什么标准方法可以从 JSON 或文本创建 Bash 字典吗?最佳实践?

考虑到我使用的答案的片段,sed 方法可能非常冗长,并且随着键/成员的数量呈指数增长:

for items in `echo $db|sed 's/{//;s/}//'`
do
        echo one${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f1`
        echo two${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f2`
        echo three${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f3`
        echo four${count} = `echo $items|sed 's/^.*\[//;s/\].*$//'|cut -d ',' -f4`
        ...
done

对于简单的字典是可以的,但是对于具有数百个键和大嵌套级别的复杂字典,它几乎不适用。

任意字典有统一的方法吗?

PS 我找到了解决相反问题的答案(在 Python 中接收 Bash dict),通过 jq解决任务,从 Bash 到 Bash以及从非常见输入创建 dict ,但没有关于 JSON 的具体内容。我不喜欢使用 jq 和 python 并坚持标准的 Bash 工具集,这个集体答案的大多数答案都使用 3rd-party 工具。有可能吗?

标签: arraysjsonbashshelldictionary

解决方案


将 JSON 对象成员转换为 Bash4+ 的关联数组的一种方法:

#!/usr/bin/env bash

# shellcheck disable=SC2155 # Associative array declaration from JSON
declare -A assoc=$(
  jq -r '"(",(to_entries | .[] | "["+(.key|@sh)+"]="+(.value|@sh)),")"' \
  input.json
)

# Debug dump the Associative array declaration
typeset -p assoc

样本输出:

declare -A assoc=([InstanceId]="i-1231231230abcdef0" [InstanceType]="t2.micro" [ImageId]="ami-0abcdef1234567890" )

推荐阅读