컬을 통해 이스케이프된 문자열 게시

컬을 통해 이스케이프된 문자열 게시

일부 원자 피드를 가져와서 Slack에 게시하는 스크립트를 만들려고 합니다.슬랙 API통과하다 curl. 지금 내가 가지고 있는 것은 간단한 텍스트에 대해 작동하지만 그 중 일부에는 큰따옴표나 &문자가 포함되어 있어 오류가 발생할 때 슬랙 API를 짜증나게 하는 것 같습니다 invalid payload. 이것은 내 스크립트입니다.

#!/bin/bash
rsstail -i 3 -u "http://MY_FEED_URL" -n 0 | while read line;
do
    # This is just a sample text, it should be ${line}
    data='Something "&" and something do " "';
    payload="payload={\"channel\": \"#my_channel\", \"username\": \"Bot\", \"text\": \"${data}\", \"icon_emoji\": \":ghost:\"}";
    echo ${payload};
    curl \
        -H "Accept: application/json" \
        -X POST \
        -d '${payload}' \
        https://hooks.slack.com/services/xxxx

"echo"의 출력은 다음과 같습니다.

payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}

저는 Bash 스크립팅에 익숙하지 않아 약간의 도움이 필요합니다. 내가 뭘 잘못했나요?

감사해요!

답변1

데이터를 URL로 인코딩해야 합니다. 가장 쉬운 방법은 curl옵션을 -d로 바꾸는 것입니다 --data-urlencode. 또한 큰따옴표를 사용해야 합니다. 그렇지 않으면 쉘이 변수를 확장하지 않으므로

curl \
    -H "Accept: application/json" \
    -X POST \
    --data-urlencode "${payload}" \
    https://hooks.slack.com/services/xxxx

또한 에 표시된 대로 문자열의 일부를 작은따옴표로 묶고 일부를 큰따옴표로 묶어서 설정을 단순화할 수도 있습니다 . payload=단, 부분 사이에 공백이 없어야 합니다 '...'"..."'...'. 그래서 우리는 얻습니다.

payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'

json 문자열에 포함되므로 큰따옴표를 이스케이프해야 할 수도 있습니다 data.\""

data='Something \"&\" and something do \" \"'

변수 입력에서 데이터를 읽었다면 linebash를 사용하여 다음과 같이 대체할 수 있습니다.

line=${line//\"/\\\"}

관련 정보