GNU/Linux >> Znalost Linux >  >> Linux

Escape Strings, které mají být zveřejněny přes Curl?

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//"/\"}

Linux
  1. Poslat fax přes Sip?

  2. Stahujte soubory přes příkazový řádek v Linuxu

  3. Jak zřetězit řetězce v Bash

  1. Předávání více parametrů přes Xargs?

  2. Proč Slack vrací chybu Segmentace po upgradu Fedory 29?

  3. Escape znak hvězdičky (*) v bash

  1. Má Curl časový limit?

  2. Smazat víceřádkové řetězce?

  3. Automatizace textových řetězců v Xmacro?