GNU/Linux >> Linux の 問題 >  >> Linux

エスケープ文字列をCurl経由で投稿しますか?

いくつかのアトムフィードを取得し、 curlを介してSlackAPIを介してそれらをSlackに投稿するスクリプトを作成しようとしています。 。私が今持っているものは単純なテキストで機能しますが、それらのいくつかには二重引用符またはがあります それらの文字は、無効なペイロードを取得するため、SlackAPIを煩わせるようです。 エラー。これが私のスクリプトです:

#!/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スクリプトの上級者ではないので、少し助けが必要です。何が間違っているのですか?

ありがとう!

承認された回答:

データをURLエンコードする必要があります。これを行う最も簡単な方法は、 curlを取得することです。 -dを置き換えることでそれを行う -data-urlencodeによるオプション 。
また、二重引用符を使用する必要があります。そうしないと、シェルが変数を展開しないため、

curl 
    -H "Accept: application/json" 
    -X POST 
    --data-urlencode "${payload}" 
    https://hooks.slack.com/services/xxxx

payload =の設定を簡素化することもできます '...' "..."'...' <のように、文字列の一部を一重引用符で囲み、一部を二重引用符で囲みます。ただし、
部分の間にスペースがない場合に限ります。 / code> 。だから、私たちは

payload='payload={"channel": "#my_channel", "username": "Bot", "text": "'"${data}"'", "icon_emoji": ":ghost:"}'

おそらくdataの二重引用符をエスケープする必要があります 、おそらく ""内にあるため json文字列で。

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

入力から変数lineにデータを読み込んだ場合 、bashでこの置換を行うことができます:

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

Linux
  1. Sip経由でFAXを送信しますか?

  2. Xmacroでの入力文字列の自動化?

  3. Fedora 29 のアップグレード後に Slack がセグメンテーション違反を返すのはなぜですか?

  1. Xargsを介して複数のパラメーターを渡す?

  2. Curlにはタイムアウトがありますか?

  3. 複数行の文字列を削除しますか?

  1. Linuxのコマンドラインからファイルをダウンロードする

  2. Bashで文字列を連結する方法

  3. ping の代替