이 컬 명령에 변수를 어떻게 추가할 수 있나요?

이 컬 명령에 변수를 어떻게 추가할 수 있나요?

텍스트 문자열을 서버로 보내는 컬 명령이 있고 파일이나 bash 변수에서 해당 텍스트 문자열을 가져오는 방법을 알아내려고 노력해 왔습니다. 명령은 다음과 같습니다.

curl -X POST -u "apikey:<apikey>"
--header "Content-Type: application/json"
--data '{"text": "<variable>"}'
"<url>"

거기에 변수를 가져오는 방법을 모르겠습니다. $variable 및 $(< file)로 바꾸려고 시도했지만 에코 없이 텍스트를 뱉어내는 방법을 모르고 컬로 에코할 수 없습니다.

답변1

작은따옴표로 묶인 문자열을 중지하고 변수 확장(큰따옴표 가능)을 수행한 다음 작은따옴표로 묶인 문자열을 복원합니다.

--data '{"text": "'"$variable"'"}'

( $variable주변 환경과 함께 합법적인 JSON을 형성하는 것으로 확장되어야 합니다. 그렇지 않으면 상대방이 매우 만족하지 않을 수 있습니다. :). )

JSON에 특수 기호가 포함될 수 있는 경우 "$variable"먼저 해당 기호를 이스케이프 처리해야 합니다.쿠사란다 보다 일반적인 답변그런 이유로.

답변2

여기에 해결책을 하나 더 제안하자면 다음과 같습니다.

curl -X POST -u "apikey:${apikey}"
--header "Content-Type: application/json"
--data "{\"text\": \"${variable}\"}"
"${url}"

기본적으로 는 "다음 문자열을 함께 처리하는 데 사용되는 인용문이며 \", 인용문을 이스케이프 처리 ${varname}하는 변수입니다.

답변3

나는 사용하는 편이다여기 문서컬과 함께 사용할 JSON을 빌드하는 경우:

curl -s -X POST $URL -d@- <<EOF
[
    {
        "id": 101,
        "text": "$variable"
    }
]
EOF

답변4

임의의 문자열이 포함된 JSON 문서를 생성한다고 가정합니다. 이 문자열은 올바르게 인용되고 JSON으로 인코딩되어야 합니다(다양한 문자는 JSON 문자열에서 리터럴로 허용되지 않으며 이스케이프하거나 인코딩으로 대체해야 함). 가장 쉬운 방법은 jq다음 과 같은 JSON 인식 도구를 사용하는 것입니다 jo.

사용(문자열이 아닌 값의 경우 명령줄에 jq지정된 각 키+값 쌍을 사용하여 객체를 생성 합니다):--arg key value--argjson key value

jq -nc --arg text "$variable" '$ARGS.named'

사용 jo(이것은 키와 값이 명령줄에서 --구분된 쌍으로 제공되는 객체를 생성합니다 =. 값 유형은 다음에서 추론됩니다 jo(매뉴얼 참조)).

jo text="$variable"

위의 두 명령 중 하나를 사용하여 생성된 JSON 문서를 다음과 같이 파이프라인에 게시할 수 있습니다.

json-generating-command |
curl --silent --show-error \
    --user "apikey:$apikey" \
    --json @- "$url"

관련 정보