私は次の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
)。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'\'''
...評価すると、3つの環境変数が正しく割り当てられエクスポートされます(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