파이프 값을 저장하는 중에 오류가 발생했습니다.

파이프 값을 저장하는 중에 오류가 발생했습니다.

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문자열이 포함된 경우 해당 문자열 \necho리터럴 탭 및 줄바꿈으로 확장될 수 있습니다. 다음 질문과 답변에서는 이에 대해 더 자세히 설명합니다.왜 printf가 echo보다 나은가요?

최상위 키 값을 jq추출하기 위해 JSON 문서를 셸 변수에서 표현식 으로 전달하려고 하므로 다음과 같이 할 수 있습니다.foo

document='{"foo": "bar"}'
signature=$( jq -n -r --argjson data "$document" '$data.foo' )

그러면 쉘 변수에 있는 JSON 구조를 포함하는 jq변수가 생성됩니다 . 그런 다음 명령은 파일이나 데이터 스트림에서 데이터를 읽지 않고( 사용되기 때문에) 키 값을 추출합니다 . 추출된 문자열은 사용된 대로 디코딩되어 쉘 변수에 저장됩니다 .datadocumentjqfoo-n-rsignature

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 변수의 값을 파이프백해야 하고 파이프된 명령의 출력을 캡처해야 한다는 것입니다.

관련 정보