我有以下 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'\'''
...如果进行评估,将正确分配和导出三个环境变量a
,b
并且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
,其中name
和value
是结构的字段名称。