cURL POST bash スクリプトはスペースを含む変数に一重引用符を追加します

cURL POST bash スクリプトはスペースを含む変数に一重引用符を追加します

最初の3つの変数には常にスペースはありません。4番目の「slacksitename」にはスペースがあります

ip=“x.x.x.x"
record_name=“demo.xyz"
slackuri:”WEBHOOK"
slacksitename:”123 Main St"

cURLで呼び出された場合

curl -X POST -H 'Content-type: application/json' --data '{"text":"’$slacksitename': '$ip' '$record_name' DDNS updated.”}’ $slackuri

出力は次のようになります。

curl -X POST -H 'Content-type: application/json' --data '{"text":"123' Main 'St: x.x.x.x demo.xyz DDNS updated."}' https://hooks.slack.com/services/……..
curl: (6) Could not resolve host: Main
curl: (3) unmatched close brace/bracket in URL position 59:
St: x.x.x.x demo.xyz DDNS updated."

なぜ一重引用符が追加されるのか、誰か知っていますか123' Main 'St? また、変数全体を分割するのではなく 1 つの文字列として扱うにはどうすればよいですか (分割していると思います)?

ありがとう

更新: 解決しました^^

フォローアップ:

これはおそらく元の質問と同じ内容です:

cURL 経由で送信したい JSON 出力の変数があります。問題は引用符にあると思いますが、JSON 出力は変わる可能性があります (引用符の数)。この生データを cURL で新しい行のメッセージに送信する方法はありますか? よろしくお願いします

DUMPING RESULTS:\n{"result":{"id":"ppbkbz2ezmxen11vvpi65chsro1vki5y","zone_id":"unuM0sR1gSrQ37r9fGC1sYKFZOP0DzJM","zone_name":"demo.xyz","name":"1.demo.xyz","type":"A","content":"x.x.x.x","proxiable":true,"proxied":false,"ttl":1,"locked":false,"meta":{"auto_added":false,"managed_by_apps":false,"managed_by_argo_tunnel":false,"source":"primary"},"created_on":"2020-06-14T19:13:57.096688Z","modified_on":"2021-10-16T16:57:49.269274Z"},"success":true,"errors":[],"messages":[]}."

答え1

bash で引用符で囲まれていない変数を使用していて、単語の分割が発生することに驚いているようです。これは発生するはずのことです。

また、質問には非標準の引用符が含まれていますが、これは自動フォーマットによるものだと思います。ただし、 は"と同じではなく'は と同じではないことに注意してくださいʼ

curl -X POST -H 'Content-type: application/json' --data '{"text":"’$slacksitename': '$ip' '$record_name' DDNS updated.”}’ $slackuri

コマンドラインでは、の引用符{"text":"で囲まれていない内容を引用$slacksitename符で囲んで追加しているため、単語の分割が行われます。最終結果は、 、 、 の 3 つの別々の引数になります。3{"text":"123番目MainSt引数は と連結され、:それ自体が引用符で囲まれていない内容と連結される$ipため、その変数にスペースが存在する場合も同じことが起こります。

これは基本的に bash 101 であり、何をしているのかわかっていない限り、変数を引用符で囲みます。

答え2

これを回避する唯一の方法は、json をファイルに保存し、それを curl 呼び出し -d "@" で参照することです。

答え3

二重引用符を使用する

curl -X POST -H 'Content-type: application/json' -d "$json"

関連情報