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文書(作成が簡単)で始まり、yq
fromを使用して変数データを挿入することです。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
これは、スクリプトのオプションの引数が--data
s値の最初の単語で終わることを意味する可能性があります。TODAY_DATE
以下の単語10:06
は(この場合)curl
オプションではなく最初のパラメータとして解析されるため、リンクするURLと見なされます(ただし、表示される正確なエラーを再現することはできません)。