I have this simple task and I've spent a few hours already trying to figure out how can I use a variable inside a curl call within my bash script:
message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'
This is outputting ${message}, literally because it's inside a single quote. If I change the quotes and put double outside and single inside, it says command not found: Hello and then command not found: there.
How can I make this work?
Variables are not expanded within single-quotes. Rewrite using double-quotes:
Just remember that double-quotes within double-quotes have to be escaped.
Another variation could be:
This one breaks out of the single quotes, encloses
${message}
within double-quotes to prevent word splitting, and then finishes with another single-quoted string. That is:While the other post (and shellcheck) correctly points out that single quotes prevent variable expansion, the robust solution is to use a JSON tool like
jq
:This works correctly even when
$message
contains quotes and backslashes, while just injecting it in a JSON string can cause data corruption, invalid JSON or security issues.