将变量值传递给curl JSON

将变量值传递给curl JSON

TODAY_DATE我正在尝试使用curl 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脚本中不再需要 shell 变量。

答案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

这很可能意味着脚本中选项的参数以s 值--data的第一个单词结尾。TODAY_DATE下面的单词(10:06在本例中)被解析为curl第一个非选项参数,因此被视为要连接的 URL(不过,我无法重现您显示的确切错误)。

也可以看看:为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?

相关内容