bash 스크립트의 컬 본문에 여러 줄의 데이터를 보내는 방법은 무엇입니까?

bash 스크립트의 컬 본문에 여러 줄의 데이터를 보내는 방법은 무엇입니까?

curl스크립트의 본문에 여러 줄의 주석을 보내려고 합니다 bash. 아래는 내 curl전화입니다.

#!/bin/bash

temp="This is sample data: 2019/05/21 03:33:04
      This is 2nd sample data: #2 Sample_Data"

response=$(curl -sS --location "${HEADERS[@]}" -w "%{http_code}\n" -X POST "$url" --header 'Content-Type: application/json' \
                        --data-raw  "{
                                \"id\" : \"111\",
                                \"status\" : {
                                .
                                .
                                .
                                \"details\" : [ \"$temp\" ]
                                }
                        }")
echo "$response"

실제 스크립트에서는 변수가 temp입니다 stdout. 따라서 여러 줄로 출력됩니다. 위 스크립트를 시도하면 다음 오류가 발생합니다.

{"exceptionClass":"xxx.exception.MessageNotReadableException","errorCode":"xxx.body.notReadable","message":"The given request body is not well formed"}400

누구든지 문제가 무엇인지, 해결 방법을 말해 줄 수 있습니까?

미리 감사드립니다

답변1

JSON 문자열에는 리터럴 줄 바꿈이 포함될 수 없습니다. 먼저 변수 값을 적절하게 JSON으로 인코딩하지 않으면 JSON 문서에 셸 변수를 삽입할 수 없습니다.

문자열을 인코딩하는 한 가지 방법은 다음을 사용하는 것입니다 jq.

status_details=$( jq -n --arg string "$temp" '$string' )

위 명령은 쉘 변수가 아닌 $string내부 변수라는 점에 유의하시기 바랍니다 . jqjq유틸리티는 명령줄에 제공된 값을 인코딩 $string하고 이를 JSON 인코딩 문자열로 출력합니다.

예제 코드가 주어지면 status_details변수는 따옴표를 포함하여 다음 리터럴 문자열로 설정됩니다.

"This is sample data: 2019/05/21 03:33:04\n      This is 2nd sample data: #2 Sample_Data"

그런 다음 통화에서 사용할 수 있습니다 curl.

curl -s -S -L -w '%{http_code}\n' -X POST \
    --data-raw '{ "id": "111", "status": { "details": [ '"$status_details"' ] } }' \
    "$url"

details배열을 사용하여 각 행을 별도의 요소로 저장하는 경우 다음과 같이 배열로 $temp분할할 수 있습니다 .$tempjq

status_details=$( jq -n --arg string "$temp" '$string | split("\n")' ) 

이것은 당신에게 다음과 같은 문자 그대로의 고통을 줄 것입니다 $status_details:

[
  "This is sample data: 2019/05/21 03:33:04",
  "      This is 2nd sample data: #2 Sample_Data"
]

curl그런 다음 위에 표시된 것과 거의 동일한 방식으로 사용할 수 있지만 $status_details대괄호( ... "details": '"$status_details"' ...)는 사용하지 않습니다.

관련 정보