curlコマンドのJSONペイロードで変数を拡張する

curlコマンドのJSONペイロードで変数を拡張する

カールを使用して投稿リクエストを送信するシェルスクリプトがあります。

#!/bin/sh
NEXT_JOB_COMMANDS='["sleep", "200s"]'

STATUS="successful"

if [ "$STATUS" = "successful" ]
then

    NEXT_JOB_ID=$(curl -s "localhost:5050/processes/gdalEcho/execution" \
    --header 'Content-Type: application/json' \
    --data '{
        "commandOverride": ["sleep", "200s"]
    }')
    echo "$NEXT_JOB_ID"
fi

変数["sleep", "200s"]に置き換えようとするまではうまくいきます。NEXT_JOB_COMMANDSカールのJSONペイロードで変数を拡張するには?

NEXT_JOB_COMMANDS='["sleep", "200s"]'

STATUS="successful"

if [ "$STATUS" = "successful" ]
then

    NEXT_JOB_ID=$(curl -s "localhost:5050/processes/gdalEcho/execution" \
    --header 'Content-Type: application/json' \
    --data '{
        "commandOverride": ' "$NEXT_JOB_COMMANDS" '
    }')
    echo "$NEXT_JOB_ID"
fi

答え1

主な問題は、実際にはコードの次の行にあるいくつかの空白文字です。

--data '{
    "commandOverride": ' "$NEXT_JOB_COMMANDS" '
}')

2番目の一重引用符は、一重引用符文字列を分割し、オプションのオプション--dataパラメータですcurl。一重引用符の後の空白文字は、文字列が次のように$NEXT_JOB_COMMANDSなることを保証します。あなた自身の主張をしてくださいその後curl}追加引数として(改行文字の前に)追加すると、はるかにcurl混乱する可能性があります。

あなたできる中間線を次に変更してこの問題を解決してください。

"commandOverride": '"$NEXT_JOB_COMMANDS"'

jq...しかし、フォーム本体に値の挿入を使用することもできます$NEXT_JOB_COMMANDS(これにより、結果のJSON本体が正しい形式で有効であることを保証できます)。


--data呼び出しに使用されたJSON文書の最上位キーで正しい形式のJSON文書(配列)を渡す場合は、curl次のことができます。

NEXT_JOB_COMMANDS='["sleep", "200s"]'

NEXT_JOB_ID=$(
    formdata=$( jq -c -n --argjson commandOverride "$NEXT_JOB_COMMANDS" '$ARGS.named' ) &&
    curl -s \
        --header 'Content-Type: application/json' \
        --data "$formdata" \
        'http://localhost:5050/processes/gdalEcho/execution'
)

printf '%s\n' "$NEXT_JOB_ID"

ここで、シェル変数formdata(ローカルでコマンドを置き換える)は値を取得します。

{"commandOverride":["sleep","200s"]}

jqこれは、指定されたJSONフラグメントをキー値として挿入することを使用して作成されますcommandOverride

上記のバリアントを使用すると、JSONを完全に作成せずに配列を配列としてシェルに格納できます。

NEXT_JOB_COMMANDS=( 'sleep' '200s' )

NEXT_JOB_ID=$(
    formdata=$(
        jq -c -n '{ commandOverride: $ARGS.positional }' --args "${NEXT_JOB_COMMANDS[@]}"
    ) &&
    curl -s \
        --header 'Content-Type: application/json' \
        --data "$formdata" \
        'http://localhost:5050/processes/gdalEcho/execution'
)

printf '%s\n' "$NEXT_JOB_ID"

上記はシェルに配列という名前が付けられていると仮定しています。/bin/shシェルの場合は、set -- sleep 200s配列要素に設定された位置引数のリストを使用し、引数の後に"$@"リストを挿入します。--argsjq

答え2

Bashでjsonに会うたびに、私は基本的にjqを使用するので、スクリプトを例にしてみましょう。

#!/usr/bin/env bash

NEXT_JOB_COMMANDS='["sleep", "200s"]'

STATUS="successful"

if [ "$STATUS" = "successful" ]
then
    echo curl -s "localhost:5050/processes/gdalEcho/execution" \
    --header 'Content-Type: application/json' --data "$(echo "$NEXT_JOB_COMMANDS" | jq -rc '{"commandOverride":.}')"
    echo "$NEXT_JOB_ID"
fi

実際のカール呼び出しに対してこれをテストできなかったので、結果コマンドをエコーし​​ました。私はこれがあなたに少なくとも半分程度に達すると信じています。

関連情報