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 페이로드 데이터를 생성하는 또 다른 방법은 정적 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'" },
이 두 줄은 다음과 같아야 합니다.
"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로 간주됩니다(그러나 표시되는 정확한 오류를 재현할 수는 없습니다).