引用符付きの文字列の引用符をエスケープします。

引用符付きの文字列の引用符をエスケープします。

curlx-www-form-urlencodeを使用してファイル内でPOST JSONデータを実行しようとしていますdocker-compose。この例では、このパブリックウェブサイトを使用しており、次のように応答する必要があります。

# sh -c 'curl http://httpbin.org/post -F "json={\"key\": \"value\"}"'
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "json": "{\"key\": \"value\"}"
  }, ...

これは外部の一重引用符でうまく機能しますが、内部に変数があるため、二重引用符が必要です。したがって、このコマンドは機能せず、入れ子になった引用符をエスケープする正しい構文を見つけることはできません。

# sh -c "curl http://httpbin.org/post -F "json={\"key\": \"$VAR\"}""
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "json": "{key:"
  }, 

ベストアンサー1

送信されるパラメータに挿入するデータcurlは、JSON文書をエンコードするJSONエンコード文字列です。

文字列は次のように別々に生成できます。

json_string=$( jq -n --arg 'my key' 'my "value"' '$ARGS.named|@json' )

JSON認識ツールを使用してjqデータをJSONエンコード文字列に変換することで、文字列の内容が有効なJSON文字列であり、指定されたキー、およびを含むmy key有効なJSON文書にデコードできることを確認します。値、my "value"

上記の正確なコマンドは文字列"{\"my key\":\"my \\\"value\\\"\"}"をに割り当てますjson_string

curlその後、次のようにパラメータからこの文字列を使用して直接呼び出すことができます。

curl 'http://httpbin.org/post' -F "json=$json_string"

sh -c...または、次のように文字列をそのスクリプトにパラメータとして渡して、インラインスクリプトから呼び出すことができます。

sh -c 'curl "http://httpbin.org/post" -F "json=$1"' sh "$json_string"

これらの呼び出しの1つは、curl次の応答を取得します。

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "json": "{\"my key\":\"my \\\"value\\\"\"}"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "160",
    "Content-Type": "multipart/form-data; boundary=------------------------f805cf070f665e7e",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.84.0",
    "X-Amzn-Trace-Id": "Root=1-83012651-2995681c270059da2906c40f"
  },
  "json": null,
  "origin": "xxx.xxx.xxx.xxx",
  "url": "http://httpbin.org/post"
}

JSONドキュメントをJSON文字列にエンコードすることはそれcurl自体で行われるように見えるので、必ずしも必要ではありません。

json_string=$( jq -n -c --arg 'my key' 'my "value"' '$ARGS.named' )

jo...JSON文字列を生成するか、インストールした場合は短い文字列を生成します。

json_string=$( jo 'my key'='my "value"' )

おすすめ記事