У меня есть эта простая задача, и я потратил несколько часов на то, чтобы попытаться выяснить, как я могу использовать переменную внутри curl-вызова в моем скрипте bash:
message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'
Это выводит $ {message}, буквально потому, что он находится внутри одной цитаты. Если я изменю кавычки и поставлю двойной внешний и один внутри, он говорит, что команда не найдена: Здравствуйте, а затем команда не найдена: там.
Как я могу сделать эту работу?
Переменные не расширяются в пределах одиночных кавычек. Перепишите с помощью двойных кавычек:
curl -X POST -H 'Content-type: application/json' --data "{\"text\": \"${message}\"}"
Просто помните, что двойные кавычки в двойных кавычках должны быть экранированы.
Другим вариантом может быть:
curl -X POST -H 'Content-type: application/json' --data '{"text": "'"${message}"'"}'
Этот фрагмент выходит из одинарных кавычек, заключает ${message} в двойные кавычки, чтобы предотвратить разделение слов, а затем заканчивается другой строкой с одним кавычком. То есть:
... '{"text": "'"${message}"'"}'
^^^^^^^^^^^^
single-quoted string
... '{"text": "'"${message}"'"}'
^^^^^^^^^^^^
double-quoted string
... '{"text": "'"${message}"'"}'
^^^^
single-quoted string
В то время как другая почта (и shellcheck) правильно указывает, что одиночные кавычки предотвращают расширение переменной, надежным решением является использование инструмента JSON, такого как jq:
message="Hello there"
curl -X POST -H 'Content-type: application/json' \
--data "$(jq -n --arg var "$message" '.text = $var')"
. Это работает правильно, даже если $message содержит кавычки и обратную косую черту, а просто вставлять их в строку JSON может привести к повреждению данных, недействительным JSON или проблемам безопасности.