Избегайте пробелов в JSON, определенных в Bash
Я хочу отправить уведомление на наш самый важный канал, если мой скрипт сборки не удастся:
test.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
может быть строкой с пробелами, например, значение может быть 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"}"'
, Как я могу предотвратить это? Я уже устанавливаю кавычки вокруг моих строк.
1 ответ
По крайней мере, вам нужно процитировать расширение параметра:
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)