如果我有一个这样的JSON,
{
"hello1": "world1",
"testk": "testv"
}
而且我想把这些键值对都导出为环境变量,怎么通过shell脚本来实现呢?比如说我在终端上写的时候,echo $hello1
,world1
应该打印出来,其他键值对也是一样的?注:上述JSON存在于名为$values
的变量中,而不是文件中。
我知道这将通过jq
完成,并为此编写了一个shell脚本,但它不起作用。
for row in $(echo "${values}" | jq -r '.[]'); do
-jq() {
echo ${row} | jq -r ${1}
}
echo $(_jq '.samplekey')
done
7条答案
按热度按时间nom7f22z1#
this answer完成了将JSON转换为key=value对的所有艰苦工作,借用this answer,您可以通过循环
jq
输出并使用export
来将这些值放入环境中:如果正在加载的变量包含嵌入的空格,这也是合理的,只是稍微复杂一些:
sbdsn5lh2#
使用命令替换
$()
:你应该做的
请注意
$values
周围的double
引号json
造成严重破坏。z2acfund3#
另一种方法不使用jq,而是使用grep & sed解析json:
解释:
=
替换:
,并删除尾随的,
**。"key"=value
下面是一个输出示例,从AWS记录集中导出json键:
导出“名称”="\052.应用程序. nmanos-群集-一个.devcluster.openshift.com”。
导出“类型”=“A”
导出“旅馆区域ID”=“Z67 SXBLZRQ 7 X7 T”
导出“域名服务器名称”=“a24070461 d50270 e-1391692. us-east-1.
导出“评估目标运行状况”=假
gzjq41n44#
现有的答案中没有一个在POSIX shell的值中保留空格,下面的代码行将使用
jq
获取一些JSON的每个key:value,并将它们导出为环境变量,适当地转义空格和特殊字符。我之前的答案并不适用于所有可能的值,可能会导致错误。请改为使用下面的行,该行使用jq的
@sh
字符串来正确地转义shell的值。您还必须将eval
之后的所有内容用引号括起来以保留换行符。我更新了示例JSON文件,以包含更多的字符来进行测试。这个答案现在似乎是唯一一个可以处理所有情况的答案。没有循环,而且只需要一行就可以导出所有值。缺点是它使用
eval
,这在理论上是危险的......但是因为 * entire * key = value现在被shell转义了,所以使用起来应该是安全的。示例JSON文件:
示例脚本:
运行示例脚本:
优点:
缺点:
eval
,我非常肯定这不是"安全的"mpgws1up5#
以下shell脚本所示的方法避免了特殊字符的大多数(但不是全部)问题:
请注意,上面假设键本身没有制表符。
h79rfbju6#
jtc解决方案:
5uzkadbs7#
我想出了一个解决方案(在bash中):
你可以这样使用它: