首页 > 解决方案 > 循环 JSON 并创建文件,其中键作为文件名,值作为文件内容

问题描述

我有一个示例 JSON

  "request_id": "016-ae81e5737add",
  "renewable": false,
  "data": {
      "client_decrypted.key": "-----BEGIN KEY-----sdjijhgisdTRjkRD05\n-----END KEY-----",
      "passphrase": "password"
    }

在我的 bash 脚本中,我正在阅读 JSON,特别是datakey 的内容。我想创建文件名为的文件key(例如:文件,如client_decrypted.key& passphrase),文件的内容作为value相应键的。

我能够使用 jq 来读取键值对

for pair in $( jq -r ".data | to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]"); do
    echo $${pair} # OUTPUT=passphrase=password
done

我想我可以使用 IFS 在=. 有没有更好的方法来做到这一点?

标签: bashjq

解决方案


一种安全的方法是发出带有 NULL 字节填充的 JSON 记录,然后在 shell 循环中将其读回,并在该字节上定界

while IFS= read -r -d '' key && IFS= read -r -d '' value; do
    printf '%s\n' "$value" > "$key"
done < <(jq -j '.data | to_entries[] | (.key, "\u0000", .value, "\u0000")' json)

由于 NULL 字节不能是任何输入记录中“有效”字节的一部分,因此它被用作分隔符。jq表达式_

(.key, "\u0000", .value, "\u0000")

在 key 和 value 字段之间附加 NULL 字节,使用 while 循环读取,一次读取两次以将 key name 和 value 字段存储在各自的变量中。

请注意,这<(..)是一种 bash/ksh93/zsh 进程替换技术,它不符合 POSIX,并且可能无法在纯 bourne shell 中工作。


推荐阅读