Вывод переменной в bash [duplicate]

У меня есть эта простая задача, и я потратил несколько часов на то, чтобы попытаться выяснить, как я могу использовать переменную внутри curl-вызова в моем скрипте bash:

message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'

Это выводит $ {message}, буквально потому, что он находится внутри одной цитаты. Если я изменю кавычки и поставлю двойной внешний и один внутри, он говорит, что команда не найдена: Здравствуйте, а затем команда не найдена: там.

Как я могу сделать эту работу?

0
задан 29 November 2016 в 00:22

2 ответа

Переменные не расширяются в пределах одиночных кавычек. Перепишите с помощью двойных кавычек:

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
3
ответ дан 15 August 2018 в 16:04
  • 1
    Черт возьми! Я знал, что это очень просто! :)) Спасибо. Я приму ответ, как только смогу. – Bravi 29 November 2016 в 00:25
  • 2
    Мне нравится второй. Я действительно был близок к этому. Одна из моих версий выглядела так: '{"text": "'${message}'"}'. Поэтому мне просто нужны внутренние двойные кавычки, но ошибка была не очень полезной, чтобы получить намек на это. – Bravi 29 November 2016 в 00:28

В то время как другая почта (и 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 или проблемам безопасности.

2
ответ дан 15 August 2018 в 16:04
  • 1
    Еще лучше, просто подключите вывод jq к curl и используйте @- в качестве аргумента для --data. Это устраняет слой цитирования. – chepner 29 November 2016 в 01:01

Другие вопросы по тегам:

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