2016-07-01 2 views
0

Как форматировать строку, используя переменную среды внутри командной строки? Например, я хочу, чтобы свернуться и передать некоторые переменные, то есть:Bash: Форматировать переменные среды в строке

curl -X POST --data-urlencode 'payload={"text": "I want to print an environment variable here, eg a path: $PATH"}' https://someapi.com/ 
+0

Если ваше намерение состоит в том, чтобы результат был действительным JSON, это, вероятно, не самый подходящий способ для этого - вы захотите использовать инструмент, поддерживающий формат, или же удивительные значения PATH могут привести к недопустимому содержимому (в лучшем случае) или инъекционные атаки на вашу полезную нагрузку (в худшем случае). –

+0

Фактически не используется переменная пути, просто пример. Спасибо за ваш вклад. – isaac

ответ

3

легкий ответ изменить вид цитаты вы используете:

curl -X POST --data-urlencode \ 
    'payload={"text": "I want to print an environment variable here, eg a path: '"$PATH"'"}' \ 
    https://someapi.com/ 

Следует отметить, что это до сих пор использует единым (поэтому вам не нужно менять свою полезную нагрузку), но затем он заканчивает одинарные кавычки, запускает двойные кавычки и вставляет вашу замену в эти двойные кавычки (перед их окончанием и переключением на одиночные кавычки, в которых буквальные - а не синтаксические - двойные кавычки могут быть встроенный).

Вариант такого подхода, что позволяет избежать необходимости в синтаксические кавычки, смешанных в содержание документа, это использовал без кавычек Heredoc, as advised by @chepner in the comments:

curl -X POST --data-urlencode @- https://someapi.com/ <<EOF 
payload={"text": "I want to print an environment variable here, eg a path: $PATH"} 
EOF 

лучше ответа заключается в использовании инструмент, который умеет форматировать JSON; jq - широко популярный выбор. Рассмотрим следующий пример:

text="I want to print an environment variable here, eg a path: \"$PATH\"" 
curl -X POST --data-urlencode @- https://someapi.com/ <<EOF 
payload=$(printf '%s\n' "$text" | jq -R '{text: .}') 
EOF 

Таким образом, вы гарантированно правильный выход, даже если ваша переменная среды содержит обратную косую черту, буквальные цитаты, непечатаемые символы, или что-то еще может прийти.

+0

Убрал мой ответ, поскольку @Charles покрыл все базы здесь. Замечание о том, что JSON требует «двойных кавычек», является важным. – Cam

+0

Вы также можете прочитать данные со стандартного ввода с помощью '--data-urlencode @ -'. – chepner

+0

Кроме того, опция' -R' может упростить 'jq 'команда' echo '$ text' | jq -R '{text:.}' | curl -X POST -date-urlencode @ - https: // someapi.com'. – chepner

Смежные вопросы