bash를 사용하여 일부 JSON을 처리하기 위해 jq를 설치했습니다. 하지만 JSON 문자열을 jq에 전달하고 해당 출력을 다른 변수에 저장하는 동안 오류가 발생했습니다.
TEST='{"foo": "bar"}'
PB_SIG=$TEST | jq '.foo'
echo $PB_SIG
전체 TEST JSON 문자열을 출력합니다. 거기 누구 없어요?
답변1
배쉬와 함께 사용:
TEST='{"foo": "bar"}'
PB_SIG=$(jq '.foo' <<< "$TEST")
echo "$PB_SIG"
산출:
"술집"
답변2
코드에 몇 가지 문제가 있습니다. 현재 문제를 일으키는 즉각적인 문제는 잘못된 구문을 사용하고 있다는 것입니다. 명령 또는 명령 파이프의 출력을 변수에 저장하려면 명령 대체를 사용할 수 있습니다 variable=$(some command)
.
두 번째 문제는 $TEST
인용되지 않은 사용입니다. 변수가 따옴표 없이 확장되면 쉘은 IFS
해당 값을 공백, 탭 및 줄 바꿈(변수의 내용)으로 분할한 다음 각 분할 비트에 파일 이름 글로빙을 적용합니다. 이는 유사한 JSON 문서가 {"foo": "a * bar"}
현재 디렉터리에 표시되는 모든 파일 이름과 함께 출력될 수 있음을 의미합니다.
echo
또 다른 문제는 가변 데이터를 출력하는 데 사용한다는 것입니다 . JSON 문서에 인코딩된 탭( ) 또는 줄바꿈( )이 포함된 \t
문자열이 포함된 경우 해당 문자열 \n
이 echo
리터럴 탭 및 줄바꿈으로 확장될 수 있습니다. 다음 질문과 답변에서는 이에 대해 더 자세히 설명합니다.왜 printf가 echo보다 나은가요?
최상위 키 값을 jq
추출하기 위해 JSON 문서를 셸 변수에서 표현식 으로 전달하려고 하므로 다음과 같이 할 수 있습니다.foo
document='{"foo": "bar"}'
signature=$( jq -n -r --argjson data "$document" '$data.foo' )
그러면 쉘 변수에 있는 JSON 구조를 포함하는 jq
변수가 생성됩니다 . 그런 다음 명령은 파일이나 데이터 스트림에서 데이터를 읽지 않고( 사용되기 때문에) 키 값을 추출합니다 . 추출된 문자열은 사용된 대로 디코딩되어 쉘 변수에 저장됩니다 .data
document
jq
foo
-n
-r
signature
signature
변수 값을 출력합니다 .
printf '%s\n' "$signature"
...하지만 단지 값을 출력하려는 경우 애초에 이를 쉘 변수에 저장하는 것은 의미가 없습니다. 대신 jq
명령 대체를 생략하여 값을 직접 출력할 수 있습니다.
document='{"foo": "bar"}'
jq -n -r --argjson data "$document" '$data.foo'
답변3
두 번째 줄에서 다음을 시도해 보세요.
PB_SIG=`echo $TEST | jq '.foo'`
내가 본 두 가지 문제는 $TEST 변수의 값을 파이프백해야 하고 파이프된 명령의 출력을 캡처해야 한다는 것입니다.