カーリングJSONに変数値を渡す

カーリングJSONに変数値を渡す

TODAY_DATEカールPOSTメソッドを使用してJIRAチケットを作成しようとしていますが、変数で変数置換が正しく発生しません。削除するとうまくいきます。この問題を解決する方法についてのヒントはありますか?

TODAY_DATE以下は、置換だけが機能せず、次のエラーによって失敗するコードです。

#!/bin/bash
JIRA_CREDS="XXX:YYY"
JIRA_PROJECT="OPS"
JIRA_URL="http://jira/jira/rest/api/2/issue/"
JIRA_CONTENT_TYPE="Content-Type: application/json"
DATE_1=`date +"%d/%b/%y %r" | cut -d":" -f1`
DATE_2=`date +"%d/%b/%y %r" | cut -d":" -f2`
DATE_3=`date +"%d/%b/%y %r" | cut -d":" -f3 | cut -d" " -f2`
TODAY_DATE=`echo "${DATE_1}:${DATE_2} ${DATE_3}"`
 curl -D- -u "$JIRA_CREDS" -X POST --data '{
 "fields": {
 "project":
 {
 "key": "'$JIRA_PROJECT'"
 },
 "summary": "Security patch update",
 "description": "The instances need to be updated via yum.",
 "customfield_13339": { "value": "Bamboo" },
 "customfield_13338": { "value": "Approved" } ,
 "customfield_13337": [{ "value": "Team" }],
 "customfield_13331": [{ "value": "SITTR" }],
 "customfield_13334": { "value": "'$TODAY_DATE'" },
 "issuetype": {
 "name": "Tech Task"
 }
 }
 }' -H "$JIRA_CONTENT_TYPE" "$JIRA_URL"

curl: (7) Failed to connect to 0.0.0.11: Invalid argument
curl: (23) Failed writing header

答え1

発生する可能性のある引用の問題を無視し、JSONコンストラクタを使用してスクリプトを再構築しますjo

#!/bin/sh

jira_creds='XXX:YYY'
jira_project='OPS'
jira_url='http://jira/jira/rest/api/2/issue/'
jira_content_type='Content-Type: application/json'

now=$( date +'%d/%b/%y %l:%M %p' )

json_data=$( jo -d . \
        fields.project.key="$jira_project" \
        fields.summary='Security patch update' \
        fields.description='The instances need to be updated via yum.' \
        fields.customfield_13339.value='Bamboo' \
        fields.customfield_13338.value='Approved' \
        fields.customfield_13337="$( jo -a "$( jo value='Team' )" )" \
        fields.customfield_13331="$( jo -a "$( jo value='SITTR' )" )" \
        fields.customfield_13334.value="$now" \
        fields.issuetype.name='Tech Task'
)

curl \
        -u "$jira_creds" \
        -X POST --data "$json_data" \
        -H "$jira_content_type" \
        "$jira_url"

値は、$json_data必要に応じてJSONでエンコードされたすべての変数データを含む正しい形式のJSON文書です。美しく印刷され、次のように見えます。

{
  "fields": {
    "project": {
      "key": "OPS"
    },
    "summary": "Security patch update",
    "description": "The instances need to be updated via yum.",
    "customfield_13339": {
      "value": "Bamboo"
    },
    "customfield_13338": {
      "value": "Approved"
    },
    "customfield_13337": [
      {
        "value": "Team"
      }
    ],
    "customfield_13331": [
      {
        "value": "SITTR"
      }
    ],
    "customfield_13334": {
      "value": "05/May/21 11:32 PM"
    },
    "issuetype": {
      "name": "Tech Task"
    }
  }
}

JSONペイロードデータを生成するもう1つの方法は、静的YAML文書(作成が簡単)で始まり、yqfromを使用して変数データを挿入することです。https://kislyuk.github.io/yq/

json_data=$( yq \
        --arg proj "$jira_project" \
        '.fields.project.key |= $proj |
         .fields.customfield_13334.value |=
                (now|strflocaltime("%d/%b/%y %l:%M %p"))' <<'END_YAML'
fields:
  summary: Security patch update
  description: The instances need to be updated via yum.
  customfield_13339:
    value: Bamboo
  customfield_13338:
    value: Approved
  customfield_13337:
    - value: Team
  customfield_13331:
    - value: SITTR
  issuetype:
    name: Tech Task
END_YAML
)

yqここではタイムスタンプを計算するため、スクリプト$nowにシェル変数が必要なくなりました。

答え2

スクリプトには、引用符のない複数の変数拡張があります。

 "key": "'$JIRA_PROJECT'"

そして

 "customfield_13334": { "value": "'$TODAY_DATE'" },

これらの2行は次のようになります。

"key": "'"$JIRA_PROJECT"'"

そして

"customfield_13334": { "value": "'"$TODAY_DATE"'" },

ただし、TODAY_DATE="${DATE_1}:${DATE_2} ${DATE_3}"/代わりに不要なコマンドを保存するコマンドを作成することもできますecho。または、より良い方法は、TODAY_DATE=$(date +"%d/%b/%y %I:%M %p")変数が必要ないことですDATE_n

拡張には$TODAY_DATE空白文字が含まれます。

$ DATE_1=`date +"%d/%b/%y %r" | cut -d":" -f1`
$ DATE_2=`date +"%d/%b/%y %r" | cut -d":" -f2`
$ DATE_3=`date +"%d/%b/%y %r" | cut -d":" -f3 | cut -d" " -f2`
$ TODAY_DATE=`echo "${DATE_1}:${DATE_2} ${DATE_3}"`
$ printf '%s\n' "$TODAY_DATE"
05/May/21 10:06 PM

これは、スクリプトのオプションの引数が--datas値の最初の単語で終わることを意味する可能性があります。TODAY_DATE以下の単語10:06は(この場合)curlオプションではなく最初のパラメータとして解析されるため、リンクするURLと見なされます(ただし、表示される正確なエラーを再現することはできません)。

また見なさい:スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

関連情報