Не могу использовать переменную оболочки в данных данных curl - PullRequest
0 голосов
/ 20 марта 2019

Дан следующий сценарий оболочки

#!/usr/bin/env bash
log=`git log discord-report..development --no-merges --decorate --format=format:'%C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an'`
echo "$log"

curl -i -H "Content-Type: application/json" -X POST --data "{ \"username\" : \"CoopR Development Info\", \"content\" : \"@everyone\n**Development** Branch has been updated.\nPlease pull the newest state!\n Changelog: '$log'  \" }" https://discordapp.com/api/webhooks/XXX/XXX

echo "$log" дает следующее:

(36 minutes ago) chore(demo): add vr development mission - xetra11
(6 hours ago) refactor(tasks): move aar to tasks addon and use more cba notify funcs - xetra11
(2 days ago) refactor(tasks): temp test deactivation - xetra11
(3 days ago) feat(tasks): add report reduncancy check function - xetra11

Весь вывод скрипта:

$ ./test.sh
(38 minutes ago) chore(demo): add vr development mission - xetra11
(6 hours ago) refactor(tasks): move aar to tasks addon and use more cba notify funcs - xetra11
(2 days ago) refactor(tasks): temp test deactivation - xetra11
(3 days ago) feat(tasks): add report reduncancy check function - xetra11
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   512  100    58  100   454     66    518 --:--:-- --:--:-- --:--:--   585HTTP/2 400
date: Tue, 19 Mar 2019 22:27:24 GMT
content-type: application/json
content-length: 58
set-cookie: __cfduid=XXX; expires=Wed, 18-Mar-20 22:27:24 GMT; path=/; domain=.discordapp.com; HttpOnly
strict-transport-security: max-age=31536000; includeSubDomains
x-ratelimit-limit: 5
x-ratelimit-remaining: 4
x-ratelimit-reset: 1553034447
via: 1.1 google
alt-svc: clear
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 4ba2dfa01fbcc4a1-DUS

{"code": 50006, "message": "Cannot send an empty message"}

Я пробовал все до сих пор, но я просто не могу заставить это работать, и мой результат git log отправляется через сообщение curl.

Что я хочу

В данный момент curl возвращает ошибку. Я хочу, чтобы содержимое $log было включено в параметр -d curl.

--data "{ \"username\" : \"CoopR Development Info\", \"content\" : \"@everyone\n**Development** Branch has been updated.\nPlease pull the newest state!\n Changelog: '$log'  \" }"

Вот как я это определил (я пробовал много форматов, но ни один не работал)

1 Ответ

1 голос
/ 20 марта 2019

Используйте jq для генерации правильно сформированного JSON-файла, содержащего произвольное содержимое в bash.В вашем случае это может выглядеть следующим образом:

log=$(git log discord-report..development --no-merges --decorate \
  --format=format:'%C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an')

preamble='@everyone
**Development** Branch has been updated.
Please pull the newest state!
 Changelog: '

json_payload=$(jq -nc --arg log "$log" --arg preamble "$preamble" '
{
  "username" : "CoopR Development Info",
  "content" : "\($preamble)\($log)"
}')

curl -i \
  -H "Content-Type: application/json" \
  -X POST \
  --data "$json_payload" \
  https://discordapp.com/api/webhooks/XXX/XXX

В качестве теста, который может выполнить любой, рассмотрите следующее (по состоянию на 2019-03-19 подсветка синтаксиса нарушена, но код работаетхорошо):

#!/usr/bin/env bash
case $BASH_VERSION in ''|[0-3]*) echo "ERROR: Bash 4.0+ needed" >&2; exit 1;; esac

log=$(cat <<'EOF'

  This is a sample message with "quotes", both 'single' and "double" and 'un'matched'.

It also has a *, and a backslash: \ <- there.
EOF
)

json_payload=$(jq -nc --arg log "$log" --arg preamble "$preamble" '
{
  "username" : "CoopR Development Info",
  "content" : "\($preamble)\($log)"
}')

printf '%s\n' "$json_payload"

... правильно выбрасывает:

{"username":"CoopR Development Info","content":"@everyone\n**Development** Branch has been updated.\nPlease pull the newest state!\n Changelog: \n  This is a sample message with \"quotes\", both 'single' and \"double\" and 'un'matched'.\n\nIt also has a *, and a backslash: \\ <- there."}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...