如何使用 jq 将 JSON 解析为环境变量

如何使用 jq 将 JSON 解析为环境变量

我有以下 json 结构

[{"name":"SQS_URL","value":"xyz"}]

我想将其转换为这种结构

SQS_URL=XZY

答案1

为了确保您获得为 shell 正确引用的数据:

$ jq -r 'map("\(.name)=\(.value|@sh)")[]' file
SQS_URL='xyz'

运算@sh符处理 shell 引用。

您是否还想将值大写(如问题所示):

$ jq -r 'map("\(.name)=\(.value|ascii_upcase|@sh)")[]' file
SQS_URL='XYZ'

如果您相信所提供的数据是安全的,则可以eval输出(我们假设这name是一个有效的变量名称并且value是一个标量):

$ unset -v SQS_URL
$ eval "$( jq -r 'map("\(.name)=\(.value|ascii_upcase|@sh)")[]' file )"
$ printf '%s\n' "$SQS_URL"
XYZ

这也将支持更长的名称和值数组(这里,我还使用了name字符串来对数组的元素进行赋值,以便于测试):

$ cat file
[
   { "name": "a[0]", "value": "xyz0" },
   { "name": "a[1]", "value": "This contains\na newline" },
   { "name": "a[2]", "value": "hello 'world'" }
]
$ jq -r 'map("\(.name)=\(.value|ascii_upcase|@sh)")[]' file
a[0]='XYZ0'
a[1]='THIS CONTAINS
A NEWLINE'
a[2]='HELLO '\''WORLD'\'''
$ unset -v a
$ eval "$( jq -r 'map("\(.name)=\(.value|ascii_upcase|@sh)")[]' file )"
$ printf '<<%s>>\n' "${a[@]}"
<<XYZ0>>
<<THIS CONTAINS
A NEWLINE>>
<<HELLO 'WORLD'>>

如果你真的想要环境变量,那么我们需要export它们。我会jq完全用另一种表达来做到这一点:

jq -r 'map(["export", "\(.name)=\(.value|ascii_upcase)"]|@sh)[]' file

这会创建类似的输出

'export' 'a=XYZ0'
'export' 'b=THIS CONTAINS
A NEWLINE'
'export' 'c=HELLO '\''WORLD'\'''

...如果进行评估,将正确分配和导出三个环境变量ab并且c(引用关键字的事实export并不重要)。

答案2

是的,你可以使用类似的东西:

$ echo '[{"name":"SQS_URL","value":"xyz"},{"name":"foo","value":"bar"}]' | jq -r '.[] | "\(.name)=\(.value)"'
SQS_URL=xyz
foo=bar

.[]部分获取数组的元素,该"\(.name)=\(.value)"部分获取输出name=value,其中namevalue是结构的字段名称。

相关内容