Избегайте пробелов в 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)
Другие вопросы по тегам