在 bash 中定义的 json 中转义空格

Escape whitespaces in a json defined in bash

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

test.sh

#!/bin/bash
set -eEx

projectName="$(grep '<name>' config.xml | sed "s@.*<name>\(.*\)</name>.*@@" | 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>.*@@'
+ 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"}"'。我怎样才能防止这种情况发生?我已经在我的字符串周围设置了引号。

最起码要引用参数展开:

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)