我有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}"
以您想要的方式设置变量是危险的。已经存在的同名变量将被覆盖,这可能会损坏您的环境。请事先考虑此安全漏洞。
我想出了两个解决方案
- 使用
eval
- 避免
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