Повторять команды при сбое до тех пор, пока они не будут успешными, но с другими флагами

Похоже, вы используете входящий веб-перехватчик.

Выберите один из следующих:

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"

0
15.05.2021, 21:55
1 ответ

Предположим, что ваш скрипт называется 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}"остальные.

Отчасти похоже:Как запустить команду, хранящуюся в переменной?

1
28.07.2021, 11:32

Теги

Похожие вопросы