jqを使用してJSONを環境変数に解析する方法

jqを使用してJSONを環境変数に解析する方法

私は次のJSON構造を持っています:

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

この構造に変換したいです。

SQS_URL=XZY

ベストアンサー1

シェルについて正しく引用されたデータを取得するには、次のようにします。

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

演算子は@shシェル引用符を処理します。

質問のように価値を大文字として活用しますか?

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

提供されたデータが安全であると思われる場合は、次のように出力できます(これは有効な変数名であり、スカラーであると仮定しますeval)。namevalue

$ 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'\'''

...評価すると、3つの環境変数が正しく割り当てられエクスポートされます(aキーワードが引用されているという事実は重要ではありません)。bcexport

おすすめ記事