0

如果我的构建脚本失败,我想向我们最重要的频道发送通知:

测试.sh

#!/bin/bash
set -eEx

projectName="$(grep '<name>' config.xml | sed "s@.*<name>\(.*\)</name>.*@\1@" | xargs)"
payload="payload={\"text\":\"${projectName}\"}\""

echo $payload

# notify mattermost channel "Jenkins Failures" in case this script fails
function notifyMattermostOnError() {
curl -i -X POST -d \
${payload} \
https://mattermost.company.com/hooks/<key>
}

notifyMattermostOnError

我从 XML 文件中提取项目名称,然后将其放入消息中。grep使用/ sed/提取项目名称xargs正在工作,这不是我的问题。

projectName可以是带有空格的字符串,f.ex. 值可能是Company App. 运行时,test.sh它会插入反引号:

mles:project mles$ ./test.sh 
++ grep '<name>' config.xml
++ sed 's@.*<name>\(.*\)</name>.*@\1@'
+ projectName='Company App'
+ payload='payload={"text":"Company App"}"'
+ echo 'payload={"text":"Company' 'App"}"'
payload={"text":"Company App"}"
+ notifyMattermostOnError
+ curl -i -X POST -d 'payload={"text":"Company' 'App"}"' https://mattermost.company.com/hooks/<key>
curl: (3) [globbing] unmatched close brace/bracket in column 8

问题是有效载荷 json 被拆分为'payload={"text":"Company''App"}"'. 我怎样才能防止这种情况发生?我已经在我的字符串周围设置了引号。

4

1 回答 1

3

至少,您需要引用参数扩展:

curl -i -X POST -d "$payload" https://mattermost.company.com/hooks/<key>

您还应该使用知道如何正确转义字符串以在 JSON 中使用的工具:

payload="payload=$(jq -n --arg pn "$projectName" '{text :$pn}')"

最后,您应该使用了解 XML 的工具来提取项目名称,而不是希望 XML 以一种grep可能有效的方式格式化。

projectName=$(xmlstarlet sel -t -v name config.xml)
于 2017-05-17T12:30:50.450 回答