Snažím se vytvořit skript, který vezme nějaké zdroje atomů a odešle je do Slack API přes curl
. To, co mám nyní, funguje pro jednoduché texty, ale některé z nich mají dvojité uvozovky nebo &
znaky v nich a zdá se, že to obtěžuje slack API, protože dostávám invalid payload
chyba. Zde je můj skript:
#!/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
Výstup „echa“ je:
payload={"channel": "#my_channel", "username": "Bot", "text": "Something "&" and something do " "", "icon_emoji": ":ghost:"}
Nejsem pokročilý ve skriptování bash a potřeboval bych trochu pomoci. Co dělám špatně?
Díky!
Přijatá odpověď:
Data musíte zakódovat do adresy URL a nejjednodušší způsob, jak toho dosáhnout, je získat curl
Chcete-li to provést nahrazením -d
možnost pomocí --data-urlencode
.
Také musíte použít dvojité uvozovky, jinak shell nerozšíří proměnnou, takže máme
curl
-H "Accept: application/json"
-X POST
--data-urlencode "${payload}"
https://hooks.slack.com/services/xxxx
Můžete také zjednodušit nastavení payload=
tím, že část řetězce bude uvnitř jednoduchých uvozovek a část uvnitř dvojitých uvozovek za předpokladu, že mezi
částmi není mezera, jako v '...'"..."'...'
. Takže dostáváme
payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'
Pravděpodobně budete muset umístit dvojité uvozovky v data
, možná s , protože budou uvnitř
""
v řetězci json.
data='Something "&" and something do " "'
Pokud jste načetli svá data ze vstupu do proměnné line
, můžete tuto náhradu provést pomocí bash:
line=${line//"/\"}