![将变量值传递给curl JSON](https://linux22.com/image/190704/%E5%B0%86%E5%8F%98%E9%87%8F%E5%80%BC%E4%BC%A0%E9%80%92%E7%BB%99curl%20JSON.png)
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 文档(很容易编写)开始,然后使用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
脚本中不再需要 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(不过,我无法重现您显示的确切错误)。