컬링 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 페이로드 데이터를 생성하는 또 다른 방법은 정적 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'" },

이 두 줄은 다음과 같아야 합니다.

"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로 간주됩니다(그러나 표시되는 정확한 오류를 재현할 수는 없습니다).

또한보십시오:공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

관련 정보