heredoc의 JSON 콘텐츠를 구문 분석할 수 없는 이유는 무엇입니까?

heredoc의 JSON 콘텐츠를 구문 분석할 수 없는 이유는 무엇입니까?

JSON 조각이 있습니다.

다음은 작동하지 않습니다:

VALUE=<<PERSON
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]"  
}
PERSON
echo -n "$VALUE" | python -m json.tool

결과 :

JSON 개체를 디코딩할 수 없습니다.

jq즉, 동일한 작업을 수행합니다.

echo -n "$VALUE" | jq '.'

출력이 없습니다.

다음은 동일한 동작을 갖습니다.

VALUE=<<PERSON
'{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]"  
}'
PERSON
echo -n "$VALUE" | python -m json.tool

회신하다:

JSON 개체를 디코딩할 수 없습니다.

그러나 다음은 작동합니다.

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool

답변1

VALUE=<<PERSON
some data
PERSON

echo "$VALUE"

출력이 없습니다.

여기에 있는 문서는 다음과 같습니다.리디렉션, 변수로 리디렉션할 수 없습니다.

명령줄을 구문 분석할 때 리디렉션은 변수 할당과 별도의 단계로 처리됩니다. 따라서 귀하의 명령은 (공백에 유의하십시오)

VALUE= <<PERSON
some data
PERSON

즉, 빈 문자열을 변수에 할당한 다음 해당 문자열의 표준 입력을 명령으로 리디렉션합니다(그러나 명령이 없으므로 아무 일도 일어나지 않습니다).

알아채다

<<PERSON
some data
PERSON

그대로 유효합니다

<somefile

데이터를 포함하도록 표준 입력 스트림을 설정할 수 있는 명령이 없으므로 손실됩니다.

그러나 이것은 작동합니다:

VALUE=$(cat <<PERSON
some data
PERSON
)

여기서 문서를 받아 cat표준 출력으로 복사하는 명령어는 다음과 같습니다. 이는 명령 대체를 통해 변수에 할당된 것입니다.

귀하의 경우에는 다음을 사용할 수 있습니다

python -m json.tool <<END_JSON
JSON data here
END_JSON

변수에 데이터를 저장하는 추가 단계를 수행할 필요가 없습니다.


이와 같은 도구를 살펴보는 것도 가치가 있을 수 있습니다.jo올바른 인코딩으로 JSON 데이터를 생성합니다.

예를 들어:

jo type=account customer_id=1234 [email protected] random_data="some^Wdata"

... 출력될 ^W리터럴 문자는 어디에 있습니까?Ctrl+W

{"type":"account","customer_id":1234,"customer_email":"[email protected]","random_data":"some\u0017data"}

따라서 질문의 명령은 다음과 같이 작성할 수 있습니다.

jo type=account customer_id=1234 [email protected] |
python -m json.tool

답변2

구분된 문서가 해당 변수를 설정하지 않기 때문에:

$ VALUE=<<PERSON  
> {    
>   "type": "account",  
>   "customer_id": "1234",  
>   "customer_email": "[email protected]",  
> }  
> PERSON
$ echo "$VALUE" 

$

구분된 문서를 사용하여 변수에 값을 할당하려면 다음과 같은 것이 필요합니다.

$ read -d '' -r VALUE <<PERSON  
{    
  "type": "account",  
  "customer_id": "1234",  
  "customer_email": "[email protected]",  
}   
PERSON

답변3

이는 JSON과 함께 사용하기 위해 여기에서 문서를 정의하는 방식이 잘못되었기 때문입니다. 다음과 같이 사용해야 합니다.

VALUE=$(cat <<EOF
{  
  "type": "account",  
  "customer_id": "1234",  
  "customer_email": "[email protected]",  
}
EOF
)

printf "$VALUE"JSON은 예상대로 덤프되어야 합니다 .

답변4

문서와 변수는 여기서 잘 섞이지 않거나 적어도 이런 방식으로는 섞이지 않습니다. 당신은 할 수 있습니다 ...

heredoc를 애플리케이션의 표준 입력으로 전달

python -m json.tool <<PERSON  
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]",
}
PERSON

또는…

쉘 변수에 여러 줄의 텍스트 저장

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "[email protected]",
}'

내부 큰따옴표를 이스케이프 처리할 필요가 없도록 작은따옴표를 사용합니다. 물론 매개변수를 확장해야 하는 경우에는 큰따옴표를 사용할 수도 있습니다.

VALUE="{
  \"type\": \"account\",
  \"customer_id\": ${ID},
  \"customer_email\": \"${EMAIL}\",
}"

그런 다음 나중에 해당 변수 값을 사용할 수 있습니다.

echo -n "$VALUE" | python -m json.tool

관련 정보