Suhayb Asked: 2022-11-23 09:54:55 +0800 CST2022-11-23 09:54:55 +0800 CST 2022-11-23 09:54:55 +0800 CST 如何使用 jq 将 JSON 解析为环境变量 772 我有以下 json 结构 [{"name":"SQS_URL","value":"xyz"}] 我想将其转换为这种结构 SQS_URL=XZY jq 2 个回答 Voted Kusalananda 2022-11-23T10:53:48+08:002022-11-23T10:53:48+08:00 为确保您获得为 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并不重要)。 Best Answer Andy Dalton 2022-11-23T10:28:56+08:002022-11-23T10:28:56+08:00 是的,你可以使用类似的东西: $ 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是结构的字段名称。
为确保您获得为 shell 适当引用的数据:
@sh
操作员处理 shell 引用。您是否还想将值大写(如问题所示):
eval
如果您相信所提供的数据是安全的(我们假设这name
是一个有效的变量名并且value
是一个标量) ,那么您可以输出:这也将支持更长的名称和值数组(在这里,为了便于测试,我还使用
name
了导致对数组元素进行赋值的字符串):如果您确实需要环境变量,那么我们需要
export
它们。我会jq
完全用另一个表达式来做到这一点:这会创建类似的输出
...如果评估,将正确分配和导出三个环境变量
a
,b
和c
(引用关键字的事实export
并不重要)。是的,你可以使用类似的东西:
该
.[]
部分为您提供数组的元素,该"\(.name)=\(.value)"
部分为您提供name=value
输出,其中name
和value
是结构的字段名称。