escape-переменная в запросе curl - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь свернуться с помощью bash-скрипта, но не могу передать значение var1 в запросе curl и получаю ошибку при выполнении ...

 #!/bin/bash
 var1="some test message"
 curl 'https://link' \
 -H 'Content-Type: application/json' \
 -d '
{"msgtype": "text", 
  "text": {
      "content": $var1
   }
}'

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Используйте приведенный ниже скрипт.

https://aaa.com' -H 'Content-Type: application/json' -d '{"msgtype": "text", "text": {      "content": '"'$var1'"'   }}'
0 голосов
/ 08 ноября 2018

В общем случае не используйте расширение параметров для динамического определения JSON, как это. Нет никакой гарантии, что ваш шаблон в сочетании с содержимым переменной будет создавать правильно сформированный JSON. (Это по тем же причинам, по которым вы не используете интерполяцию строк для создания динамических запросов SQL.) Вместо этого используйте инструмент типа jq.

curl 'https://link' ... \
  -d "$(jq --argjson x "$var" \
           -n '{msgtype: "text", text: {content: $x}}')"
0 голосов
/ 08 ноября 2018

Ваша переменная $var1 не раскрывается оболочкой, поскольку находится внутри одинарной кавычки '.

Вам нужно использовать двойные кавычки, чтобы позволить bash выполнить расширение параметров и экранировать ваши данные json:

#!/bin/bash
var1="some test message"
curl 'https://link' \
-H 'Content-Type: application/json' \
-d "
{
  \"msgtype\": \"text\", 
  \"text\": {
    \"content\": \"$var1\"
  }
}"

Или вы можете использовать встроенный документ (без выхода из ада, но команда становится неловкой):

#!/bin/bash
var1="some test message"
curl 'https://link' \
-H 'Content-Type: application/json' \
-d "$(cat <<EOT
{
  "msgtype": "text", 
  "text": {
    "content": "$var1"
  }
}
EOT
)"
...