Как я могу выполнить команду, которая имеет комбинацию кавычек и двойных кавычек?

Цель моего скрипта — отправить сообщение на сервер Mattermost. Поэтому я использую curl для этого:

#!/bin/bash
message="This is my message with potentially several quotes in it ..."
url=http://www.myMatterMostServer.com/hooks/myMattermostKey
payload="{ \"text\" : \"$message\" }"
curlCommand="curl --insecure --silent --show-error --header 'Content-Type: application/json' -X POST --data '"$payload"' "$url
echo -e $curlCommand
$curlCommand

Команда echo показывает что-то, что является исполняемым, если я скопирую его и выполню прямо в терминале.

Но последняя строка не выполняется правильно, и у меня есть это в консоли:

++ curl --insecure --silent --show-error --header ''\''Content-Type:' 'application/json'\''' -X POST --data ''\''{' '"text"' : '"This' is my message with potentially several quotes in it '..."' '}'\''' http://poclo7.sii24.pole-emploi.intra/hooks/iht8rz8uwf81fgoq9ser8tda3y
curl: (6) Couldn't resolve host 'application'
curl: (6) Couldn't resolve host '"text"'
curl: (6) Couldn't resolve host ':'
curl: (6) Couldn't resolve host '"This'
curl: (6) Couldn't resolve host 'is'
curl: (6) Couldn't resolve host 'my'
curl: (6) Couldn't resolve host 'message'
curl: (6) Couldn't resolve host 'with'
curl: (6) Couldn't resolve host 'potentially'
curl: (6) Couldn't resolve host 'several'
curl: (6) Couldn't resolve host 'quotes'
curl: (6) Couldn't resolve host 'in'
curl: (6) Couldn't resolve host 'it'
curl: (6) Couldn't resolve host '..."'

Я пробовал так много комбинаций кавычек, двойных кавычек и $ (команда) ... Пожалуйста, помогите мне :-)


person OphyTe    schedule 31.05.2017    source источник
comment
Возможно, стоит поместить всю полезную нагрузку в файл и указать curl прочитать файл для данных. stackoverflow.com/ вопросы/3007253/ stackoverflow.com/questions/6408904/   -  person GregHNZ    schedule 31.05.2017


Ответы (1)


Переменные предназначены для данных, а не для кода. См. Часто задаваемые вопросы по Bash 50. Вместо этого определите функцию.

curlCommand () {
    message=$1
    url=$2
    payload='{"text": "$message"}'
    curl --insecure --silent --show-error \
         --header 'Content-Type: application/json' \
         -X POST --data "$payload" "$url"
}

curlCommand "This is my message with potentially several quotes in it ..." http://www.myMatterMostServer.com/hooks/myMattermostKey

Рассмотрите возможность использования jq для создания полезной нагрузки, чтобы убедиться, что содержимое $message правильно экранировано.

payload=$(jq --arg msg "$message" '{text: $msg}')

или направить вывод jq непосредственно в curl:

jq --arg msg "$message" '{text: $msg}' | curl ... --data @- ...
person chepner    schedule 31.05.2017
comment
Вы можете использовать любой язык, предоставляющий библиотеку JSON; дело в том, что вы не должны пытаться сгенерировать JSON вручную с помощью интерполяции переменных. - person chepner; 20.06.2017
comment
Наконец-то мне удалось заставить его работать с помощью 6-го метода Bash FAQ (действительно хороший материал от путь). У меня также была небольшая проблема с CR/LF, которую мне помог решить этот пост. Еще раз спасибо @chepner - person OphyTe; 22.06.2017