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