나는 다음과 같은 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'\'''
...평가되면 세 가지 환경 변수가 올바르게 할당되고 내보내집니다 ( 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