Mam próbkę JSON

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

W moim skrypcie bash, czytam JSON w szczególności zawartość data. Chciałbym utworzyć pliki z nazwą pliku jako key (np.: Pliki takie jak client_decrypted.key & amp; passphrase) z zawartością plików jako value odpowiedniego klucza .

Udało mi się użyć JQ, aby odczytać parę kluczy i wartości

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

Myślę, że mogę użyć IFS, aby podzielić każdą parę na =. Czy jest lepszy sposób na to?

1
yesh 5 październik 2020, 09:57

1 odpowiedź

Najlepsza odpowiedź

Jednym z bezpiecznego sposobu na emisję rekordów JSON z wyściółką bajtową zerową, a następnie później przeczytaj go z powrotem w pętli powłoki, deiming na tym bajcie

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)

Ponieważ Bajt NULL nie może być częścią "ważnego" bajtu w żadnej z zapisów wejściowych, jest używany jako znak przygraniczny. Wyrażenie jq

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

Dołącza bajt zerowy między kluczem a polem wartości, który jest odczytywany za pomocą pętli, dwóch odczytuje w czasie przechowywania nazwy klucza i pól wartości w odpowiednich zmiennych.

Należy pamiętać, że <(..) jest techniką podstawienia procesu Bash / KSH93 / ZSH, która nie jest zgodna z POSIX i może nie działać w czystych skorupach Bourne.

1
Inian 5 październik 2020, 07:30