Похоже, вы используете входящий веб-перехватчик.
Выберите один из следующих:
a )удалите -H 'Content-type: application/json'
или измените его на-H 'Cotent-type: application/x-www-form-urlencoded'
curl.exe -X POST --data-urlencode "payload={\"channel\": \"#channelname\", \"username\": \"webhookbot\",\"text\": \"%topic\",\"icon_emoji\": \":ghost:\"}" SLACK_WEBHOOK_URL
b )оставить тип содержимого -как есть, но изменить --data-urlencode
на -d
и удалить payload=
из данных
curl.exe -X POST -H "Content-Type: application/json" -d "{\"channel\": \"#channelname\", \"username\": \"webhookbot\",\"text\": \"%topic\",\"icon_emoji\": \":ghost:\"}" SLACK_WEBHOOK_URL
Но если вы используете Slack API (, например, /chat.postMessage):
1 )нужно авторизоваться по токену -добавить опцию curl-H "Authorization: Bearer YOUR_TOKEN_HERE"
2 )не используйте --data-urlencode
, но-d
из документов:https://api.slack.com/methods/chat.postMessage
When POSTing with application/x-www-form-urlencoded data, the optional attachments argument should contain a JSON-encoded array of attachments. Make it easy on yourself and send your entire messages as application/json instead.
3 )удалить из данных payload=
из данных
curl.exe -X POST -H 'Content-Type: application/json' -H "Authorization: Bearer YOUR_TOKEN_HERE" -d "{ \"channel\": \"#channelname\", \"text\": \"message body\", \"username\": \"webhookbot\", \"icon_emoji\": \":ghost:\" }" "https://slack.com/api/chat.postMessage"
Предположим, что ваш скрипт называется retry.sh
и вызывается из оболочки с помощью командной строки retry.sh ls "foo bar"
, аргументы позиционных параметров (, т.е. $1
, $2
... )внутри сценарий будет ls
и foo bar
. Обратите внимание, что хотя кавычки — это способ защитить пробелы и другие специальные символы в командной строке оболочки, кавычки больше не существуют в запущенном скрипте. Вместо этого у вас есть массив строк.
Теперь, "$@"
правильно обрабатывает отдельные параметры, :каждый расширяется до отдельного слова. Но если вы выполняете "$(echo "$@" | sed "s/^pattern/pattern --otherflag/g")"
, то echo
объединяет свои аргументы в одну строку, а кавычки вокруг всей подстановки команд сохраняют ее как одну строку, вместо разделения слов на пробелы. Не то, чтобы разделение помогло, так как в этот момент разделение между исходными аргументами теряется, и один аргумент foo bar
будет таким же, как два аргумента foo
и bar
.
Кроме того, "${@/pattern/pattern --otherflag}"
будет выполнять замену внутри каждого позиционного параметра отдельно, поэтому с параметрами ls
и foo bar
, "${@/ls/ls --otherflag}"
приведет к двум словам ls --otherflag
. Это будет искать команду, буквально называемую ls --otherflag
, так же, как если бы вы запускали "ls --otherflag"
в командной строке оболочки.
Вам нужно ls
, --otherflag
,foo bar
, т.е. добавить флаг в качестве дополнительного аргумента.
Хотя вы могли бы взять все аргументы из $@
, экранировать их для обработки оболочкой и соединить их вместе, чтобы создать допустимую командную строку, затем отредактировать эту командную строку и отправить ее обратно в оболочку. с eval
безопаснее просто работать со списком как со списком.
Добавить аргумент в конец было бы относительно легко:
#!/bin/sh
if ! "$@"; then
echo "failed, retrying..."
if ! "$@" --otherflag; then
echo "nope, still failed"
fi
fi
Для добавления единицы в середину требуются массивы или нарезка $@
. Например. добавить флаг на вторую позицию:
#!/bin/bash
if ! "$@"; then
echo "failed, retrying..."
if ! "$1" --otherflag "${@:2}"; then
echo "nope, still failed"
fi
fi
"${@:n:m}"
расширяется до первых m позиционных параметров, начиная с индекса n , или до конца списка м не дано. Итак, "$1"
— это первый аргумент (, такой же, как "${@:1:1}"
), и "${@:2}"
остальные.
Отчасти похоже:Как запустить команду, хранящуюся в переменной?