使用bash解析json形式的变量



我有JSON的变量:

export RESPONSE=$(curl -s --request POST --data "$some_data" $some_url)
In RESPONSE
{
"data": {
"warnings": "1",
"auth": "no"
... and a lot of variables
}
}

我需要如何创建变量:

$warnings="1"
$auth="no"
....

我只需要字段"data"中的变量。

在bash中,据我所知,没有to_entries

然而,我需要在脚本运行时不要将#RESPONSE中的数据写入控制台。

更新:

我有这个工作代码,但它将所有JSON写入控制台,这不是我想要的。

export ENV_SETTER=$(for i in $KEYS; do echo -n env.$i=$(echo $RESPONSE | jq -r .data.$i),;done)

接下来我需要这个

--set "${ENV_SETTER}"

以您想要的方式设置变量是危险的。已经存在的同名变量将被覆盖,这可能会损坏您的环境。请事先考虑此安全漏洞。

我想出了两个解决方案

  1. 使用eval
  2. 避免eval

溶液1

eval $(jq -r '.data | to_entries | map("export " + .key + "='"'"'" + .value + "'"'"'")[]' "$FILE")

eval执行jq:生成的代码

export warnings='1'
export auth='no'

备注

  • 隐式'"'"'"不是jq语法。这是在bash中向字符串添加单引号的一种方法

解决方案2

RESPONSE='
{
"data": {
"warnings": "1",
"auth": "no"
}
}
'
KEYS=$(jq -r '.data | keys[]' <<< "$RESPONSE")
for KEY in $KEYS; do
VALUE=$(jq -r --arg key "$KEY" '.data | .[$key]' <<< "$RESPONSE")
read "$KEY" <<< "$VALUE"
done

最新更新