このカールコマンドに変数を追加するにはどうすればよいですか?

このカールコマンドに変数を追加するにはどうすればよいですか?

私はテキスト文字列をサーバーに送信するカールコマンドを持っていて、ファイルまたはbash変数からそのテキスト文字列を取得する方法を見つけようとしました。コマンドは次のとおりです。

curl -X POST -u "apikey:<apikey>"
--header "Content-Type: application/json"
--data '{"text": "<variable>"}'
"<url>"

そこに変数を取得する方法がわかりません。 $variableと$(< file)に置き換えようとしましたが、エコーなしでテキストを吐き出す方法がわからず、カールでエコーできませんでした。

答え1

一重引用符で囲まれた文字列を停止し、変数拡張(二重引用符を使用)を実行してから、一重引用符で囲まれた文字列を復元します。

--data '{"text": "'"$variable"'"}'

$variable周囲の環境で合法的なJSONを形成するように拡張する必要があります。そうしないと、相手は非常に満足していない可能性があります。) )

JSONに特殊シンボルを含めることができる場合は、"$variable"まずそのシンボルをエスケープする必要があります。クサランダ より一般的な答えそのような理由で。

答え2

ここで解決策をもう1つ提案すると、次のようになります。

curl -X POST -u "apikey:${apikey}"
--header "Content-Type: application/json"
--data "{\"text\": \"${variable}\"}"
"${url}"

デフォルトでは、"次の文字列を一緒に処理するために使用される引用符であり、\"引用符をエスケープ${varname}する変数です。

答え3

私は使い方ですここのドキュメントカールで使用するJSONをビルドする場合:

curl -s -X POST $URL -d@- <<EOF
[
    {
        "id": 101,
        "text": "$variable"
    }
]
EOF

答え4

ランダムな文字列を含むJSONドキュメントを生成するとします。この文字列は正しく引用され、JSONでエンコードする必要があります(さまざまな文字はJSON文字列ではリテラルとして受け入れられず、エスケープまたはエンコードで置き換える必要があります)。最も簡単な方法は、jq次のJSON認識ツールを使用することですjo

使用(非文字列値の場合は、コマンドラインでjq指定された各キーと値のペアを使用してオブジェクトを作成します):--arg key value--argjson key value

jq -nc --arg text "$variable" '$ARGS.named'

使用(これは、キーと値がコマンドラインで --区切りペアjoで提供されるオブジェクトを生成します=jo

jo text="$variable"

上記の2つのコマンドのいずれかを使用して、生成されたJSONドキュメントを次のようにパイプラインに公開できます。

json-generating-command |
curl --silent --show-error \
    --user "apikey:$apikey" \
    --json @- "$url"

関連情報