カールを使用して投稿リクエストを送信するシェルスクリプトがあります。
#!/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
配列要素に設定された位置引数のリストを使用し、引数の後に"$@"
リストを挿入します。--args
jq
答え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
実際のカール呼び出しに対してこれをテストできなかったので、結果コマンドをエコーしました。私はこれがあなたに少なくとも半分程度に達すると信じています。