我有这个简单的任务,我已经花了几个小时试图弄清楚如何在我的bash脚本中使用curl调用中的变量:
message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'
这是输出$ {message},字面上是因为它在单引号内。如果我更改引号并将double放在外部并且单个内部,则表示找不到命令:Hello,然后找不到命令:那里。
我该如何做到这一点?
答案 0 :(得分:7)
变量不会在单引号内展开。使用双引号重写:
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
答案 1 :(得分:2)
虽然其他帖子(和shellcheck)正确地指出单引号阻止了变量扩展,但强大的解决方案是使用jq
之类的JSON工具:
message="Hello there"
curl -X POST -H 'Content-type: application/json' \
--data "$(jq -n --arg var "$message" '.text = $var')"
即使$message
包含引号和反斜杠,这也能正常工作,而只是将其注入JSON字符串可能会导致数据损坏,JSON无效或安全问题。