要通过 curl 发布的转义字符串

Com*_*rse 4 shell-script escape-characters

我试图让一个脚本,需要一些原子的饲料和职位他们通过松懈松弛API通过curl。我现在所拥有的内容适用于简单的文本,但其中一些包含双引号或&字符,当我收到invalid payload错误消息时,这似乎让 slack API 感到恼火。这是我的脚本:

#!/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
Run Code Online (Sandbox Code Playgroud)

“回声”的输出是:

payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
Run Code Online (Sandbox Code Playgroud)

我在 bash 脚本方面并不先进,我需要一点帮助。我究竟做错了什么 ?

谢谢!

meu*_*euh 8

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

curl \
    -H "Accept: application/json" \
    -X POST \
    --data-urlencode "${payload}" \
    https://hooks.slack.com/services/xxxx
Run Code Online (Sandbox Code Playgroud)

您还可以payload=通过将部分字符串放在单引号内,将部分放在双引号内来简化设置,前提是各部分之间没有空格,如'...'"..."'...'. 所以,我们得到

payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Run Code Online (Sandbox Code Playgroud)

您可能需要对 中的双引号进行转义data,或者使用\,因为它们将""在 json 字符串中。

data='Something \"&\" and something do \" \"'
Run Code Online (Sandbox Code Playgroud)

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

line=${line//\"/\\\"}
Run Code Online (Sandbox Code Playgroud)