如果我有这样的JSON,
{
"hello1": "world1",
"testk": "testv"
}
Run Code Online (Sandbox Code Playgroud)
我想将这些键值对中的每一个导出为环境变量,如何通过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
Run Code Online (Sandbox Code Playgroud)
编辑:尝试Turn的答案,我这样做了:
values='{"hello1":"world1","hello1.world1.abc1":"hello2.world2.abc2","testk":"testv"}'
for s in $(echo $values | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]" ); do
export $s
done
Run Code Online (Sandbox Code Playgroud) 我对此做了一些研究,感觉好像我已经完成了 80% 的工作,但由于分割其中一根字符串,我很难根据需要调整 jq 输出。
我正在尝试将 AWS SSM 的 JSON 输出转换为环境变量。
AWS命令
aws ssm get-parameters-by-path \
--path /qa/es \
--with-decryption \
--query 'Parameters[*].{Name:Name,Value:Value}' \
Run Code Online (Sandbox Code Playgroud)
输出
[
{
"Name": "/qa/es/AWS_ACCESS_KEY_ID",
"Value": "ABC123"
},
{
"Name": "/qa/es/AWS_SECRET_ACCESS_KEY",
"Value": "abcdefghijkl"
},
{
"Name": "/qa/es/ENDPOINT",
"Value": "https://amazonaws.com"
}
]
Run Code Online (Sandbox Code Playgroud)
我所需的 jq 输出,请注意,我仅在最后一个 / 之后的环境变量之后。在某些情况下,这可能是 /qa/es/something/nested/ENV_VAR
AWS_ACCESS_KEY_ID=ABC123
AWS_SECRET_ACCESS_KEY=abcdefghijkl
ENDPOINT=https://amazonaws.com
Run Code Online (Sandbox Code Playgroud)
一旦我有了这个,我就可以利用这里的答案来设置环境变量。将 JSON 导出到环境变量
我最接近的是
jq -r "map(\"\(try(.Name |= split(\"/\")))=\(.Value|tostring)\")|.[]" params.json
Run Code Online (Sandbox Code Playgroud)
这给了我
{"Name":["","qa","es","AWS_ACCESS_KEY_ID"],"Value":"ABC123"}=ABC123
{"Name":["","qa","es","AWS_SECRET_ACCESS_KEY"],"Value":"abcdefghijkl"}=abcdefghijkl
{"Name":["","qa","es","ENDPOINT"],"Value":"https://amazonaws.com"}=https://amazonaws.com
Run Code Online (Sandbox Code Playgroud)
接近,但还不够接近!有人能在这里指出正确的方向吗?