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

...평가되면 세 가지 환경 변수가 올바르게 할당되고 내보내집니다 ( a키워드 가 인용되어 있다는 사실 은 중요하지 않습니다).bcexport

답변2

예, 다음과 같은 것을 사용할 수 있습니다.

$ echo '[{"name":"SQS_URL","value":"xyz"},{"name":"foo","value":"bar"}]' | jq -r '.[] | "\(.name)=\(.value)"'
SQS_URL=xyz
foo=bar

.[]부분은 배열의 요소를 가져오고 이 부분은 구조의 필드 이름이 어디에 있는지 "\(.name)=\(.value)"출력을 가져옵니다 .name=valuenamevalue

관련 정보