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 脚本方面并不先进,我需要一点帮助。我究竟做错了什么 ?
谢谢!
您需要对数据进行 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)