curlコマンドでbash変数を解析できません。

curlコマンドでbash変数を解析できません。

こんにちは、投稿からジョブを生成するためにパイプカールメソッドを使用しています。ハードコードされた値を使用して端末で実行すると、正常に動作します。ただし、変数を使用して実行しようとするとエラーが発生します。

スクリプト:

#!/bin/bash
echo "$1"
echo "$2"
echo "$3"
echo "$4"
echo "$5"
echo '{
  "transactions": [
    {
      "type": "title",
      "value": "$1"
    },
    {
      "type": "description",
      "value": "$2"
    },
    {
      "type": "status",
      "value": "$3"
    },
    {
      "type": "priority",
      "value": "$4"
    },
    {
       "type": "owner",
       "value": "$5"
    }
  ]
}' | arc call-conduit --conduit-uri https://mydomain.phacility.com/ --conduit-token mytoken maniphest.edit

実装する:

./test.sh "test003 ticket from api post" "for testing" "open" "high" "ahsan"

出力:

test003 ticket from api post
for testing
open
high
ahsan
{"error":"ERR-CONDUIT-CORE","errorMessage":"ERR-CONDUIT-CORE: Validation errors:\n  - User \"$5\" is not a valid user.\n  - Task priority \"$4\" is not a valid task priority. Use a priority keyword to choose a task priority: unbreak, very, high, kinda, triage, normal, low, wish.","response":null}

エラーが示すように、$ 4と$ 5を変数ではなく値として読み込みます。 $variablesをこれらのパラメータの入力として使用する方法を理解できません。

答え1

ここでの問題は一重引用符を使用していることです。シェルによる変数拡張を防止します。代わりに二重引用符を使用するか (内部二重引用符をエスケープする)、変数 $X の周囲に一重引用符を追加します。

たとえば、次のコマンドを比較します。

$ test_var="wiii" && echo '"$test_var"'
"$test_var"

これ:

$ test_var="wiiii" && echo "\"$test_var\""
"wiiii"

これ:

$ test_var="wiiii" && echo '"'$test_var'"'
"wiiii"

読むべき追加情報:

答え2

主な問題は、シェルが一重引用符で変数を拡張しないことです。また、ユーザーが提供した生データをエンコードせずにJSONドキュメントに直接挿入するという問題もあります。

そうすることでこれを行うことができます。jqユーザー提供のデータをエンコードします。

#!/bin/sh

if [ "$#" -ne 5 ]; then
    printf 'Expected 5 arguments, got %d\n' "$#" >&2
    exit 1
fi

for type in title description status priority owner
do
        jq -n --arg type "$type" --arg value "$1" '{ type: $type, value: $value }'
        shift
done | jq -c -s '{ transactions: . }' |
arc call-conduit \
        --conduit-uri 'https://mydomain.phacility.com/' \
        --conduit-token 'mytoken' \
        maniphest.edit

スクリプトはコマンドライン引数を使用し、適切なコンテンツを含むaキーとaキーを含むオブジェクトをtransactions生成して配列要素を作成します。jqtypevalue

transactionsjqその後、結果オブジェクトは別の呼び出し(ループから読み取る)を介して配列に挿入されます。これにより、最終的なJSON文書が生成され、arcコマンドに渡されます。

少し長くて複雑に見えるよりも

jq -n --arg type "$type" --arg value "$1" '{ type: $type, value: $value }'

ループ本体で利用可能joツールこのように:

jo type="$type" value="$1"

このjo呼び出しと元の呼び出しの両方(ループ変数)と(カスタムコマンドライン引数)が適切にJSONにエンコードされていることをjq確認してください。$type$1

5つのパラメータ"test003" ticket from api post、、、for "testing"およびをopen指定すると、このコードは次の文書と同じJSON文書を生成して渡します。highahsanarc

{
  "transaction": [
    {
      "type": "title",
      "value": "\"test003\" ticket from api post"
    },
    {
      "type": "description",
      "value": "for \"testing\""
    },
    {
      "type": "status",
      "value": "open"
    },
    {
      "type": "priority",
      "value": "high"
    },
    {
      "type": "owner",
      "value": "ahsan"
    }
  ]
}

二重引用符はすべて正しく処理されます。

関連情報