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
합니다 .$V
1
$?
X
쓰다
값을 전달하면 해당 값 --arg NAME VALUE
이 명령줄 인수로 jq
허용 되고 입력에서 다음과 같이 인용 될 수 있는 문자열 표현이 할당됩니다 .VALUE
JSON
NAME
jq
$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
되고 입력에서 다음과 같이 참조 될 수 있는 문자열 표현이 할당됩니다 .jq
FILE
JSON
NAME
jq
$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
. 좋은 점은 입력을 생성하는 동안 오류가 발생하면 실행이 중지되고 그대로 유지된다는 것입니다.FILE
jq
set -e
set -o pipefail
sponge FILE < <(jq ... FILE)
sponge
FILE