如何在bash脚本中的curl调用中使用变量

Bra*_*avi 4 bash shell curl

我有这个简单的任务,我已经花了几个小时试图弄清楚如何在我的bash脚本中使用curl调用中的变量:

message="Hello there"
curl -X POST -H 'Content-type: application/json' --data '{"text": "${message}"}'
Run Code Online (Sandbox Code Playgroud)

这是输出$ {message},字面上是因为它在单引号内.如果我更改引号并将double放在外部并且单个内部,则表示找不到命令:Hello,然后找不到命令:那里.

我怎样才能做到这一点?

Sto*_*ica 13

变量不会在单引号内扩展.使用双引号重写:

curl -X POST -H 'Content-type: application/json' --data "{\"text\": \"${message}\"}"
Run Code Online (Sandbox Code Playgroud)

请记住,必须转义双引号内的双引号.

另一种变化可能是:

curl -X POST -H 'Content-type: application/json' --data '{"text": "'"${message}"'"}'
Run Code Online (Sandbox Code Playgroud)

这个突破单引号,用${message}双引号括起来以防止分词,然后用另一个单引号字符串结束.那是:

... '{"text": "'"${message}"'"}'
    ^^^^^^^^^^^^
    single-quoted string


... '{"text": "'"${message}"'"}'
                ^^^^^^^^^^^^
                double-quoted string


... '{"text": "'"${message}"'"}'
                            ^^^^
                            single-quoted string
Run Code Online (Sandbox Code Playgroud)


tha*_*guy 7

虽然另一篇文章(和shellcheck)正确地指出单引号会阻止变量扩展,但可靠的解决方案是使用 JSON 工具,例如jq

message="Hello there"
curl -X POST -H 'Content-type: application/json' \
    --data "$(jq -n --arg var "$message"  '.text = $var')"
Run Code Online (Sandbox Code Playgroud)

即使$message包含引号和反斜杠,这也能正常工作,而仅将其注入 JSON 字符串可能会导致数据损坏、无效的 JSON 或安全问题。

  • 更好的是,只需将 `jq` 的输出通过管道传输到 `curl` 并使用 `@-` 作为 `--data` 的参数。这消除了一层引用。 (5认同)