jq를 통해 bash 변수를 저장하는 쉬운 방법이 있습니까?

jq를 통해 bash 변수를 저장하는 쉬운 방법이 있습니까?

declare외부에서 연관 배열을 수동으로 읽고 쓰는 옵션을 사용하지 않고 지속적인 bash 연관 배열(사전) 저장소를 생성하는 간단한 방법을 찾고 있습니다 .

"jq" 및 "json" 저장소는 확실히 내부 bash 저장소보다 더 강력하지만, 방대한 양의 "jq" 정보 중에서 bash를 "jq"와 연결하는 간단한 답을 찾을 수 없습니다.

휘발성 bash 연관 배열을 사용하는 대신 jq및 파일을 사용하여 bash에 영구 키 문자열 값을 저장/호출/삭제할 수 있나요 ?JSON

참고: 귀하의 의견에 감사드립니다. 제 질문을 더 잘 표현했다고 생각하지만 예제를 추가하는 것은 이 문제에 적용되지 않습니다.

답변1

읽다

--raw-output출력에서 js 참조를 제거하고 출력을 // empty삭제 null(및 ) 하면 값을 읽는 것이 매우 쉽습니다 .false

echo '{"Z":"zee","V":"vee"}' > d
V=$(jq --raw-output '.V // empty' d)

--exit-status빈 문자열 값과 js 호출을 찾을 수 없는 것을 구별하려면 다음을 사용하십시오 null.

echo '{"Z":"zee","V":"vee"}' > d
V=$(jq --exit-status --raw-output '.X' d)

키를 찾을 수 없으므로 및 에 할당 null합니다 .$V1$?X

쓰다

값을 전달하면 해당 값 --arg NAME VALUE이 명령줄 인수로 jq허용 되고 입력에서 다음과 같이 인용 될 수 있는 문자열 표현이 할당됩니다 .VALUEJSONNAMEjq$ARGS.named.NAME

echo '{"Z":"zee","V":"vee"}' > d
V=$'This\tis a fancy\nvalue containing "quotes" and more \\'
sponge d < <(jq --arg V "$V" '."V"=$ARGS.named.V' d)

값을 전달하면 콘텐츠가 허용 --rawfile NAME FILE되고 입력에서 다음과 같이 참조 될 수 있는 문자열 표현이 할당됩니다 .jqFILEJSONNAMEjq$NAME

echo '{"Z":"zee","V":"vee"}' > d
sponge d < <(jq --rawfile V <(printf 'This\tis a fancy\nvalue containing "quotes" and more \\') '."V"=$V' d)

삭제

값을 삭제하는 것은 쉽습니다...

sponge d < <(jq 'del(.V)' d)

논평

여기의 예에서는 이 형식을 사용하여 sponge FILE < <(jq ... FILE)인라인 대체를 시뮬레이션합니다 FILE. 이와 같은 다른 방법을 사용할 수 있지만 JSON=$(jq ...)오류가 발생하여 중지할 수 없는 경우(잘못된 입력 또는 텍스트로 인해 발생하기 쉬움) 빈 jq ... FILE | sponge FILE결과가 발생합니다 sponge. 좋은 점은 입력을 생성하는 동안 오류가 발생하면 실행이 중지되고 그대로 유지된다는 것입니다.FILEjqset -eset -o pipefailsponge FILE < <(jq ... FILE)spongeFILE

관련 정보