通过curl发布转义字符串

通过curl发布转义字符串

我正在尝试制作一个脚本,该脚本需要一些原子提要并将它们发布到松弛状态松弛API通过curl。我现在所拥有的适用于简单的文本,但其中一些包含双引号或&字符,当我收到错误时,这似乎会惹恼 slack 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

“回声”的输出是:

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

我对 Bash 脚本不是很熟悉,需要一点帮助。我做错了什么?

谢谢!

答案1

您需要对数据进行 url 编码,最简单的方法是将curl选项替换-d--data-urlencode.另外,你需要使用双引号,否则 shell 不会扩展变量,所以我们有

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:"}'

您可能需要转义中的双引号data,也许使用\,因为它们将位于""json 字符串中。

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

如果您已从变量的输入中读取数据line,则可以使用 bash 进行此替换:

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

相关内容