如何在 bash 行 CURL 中包含环境变量?

Dan*_*Dan 56 bash environment-variables

尝试让传输在下载完成时通知。

这有效:

curl -u <my-api-token>: \
  -X POST https://api.pushbullet.com/v2/pushes \
  --header 'Content-Type: application/json' \
  --data-binary '{"type": "note", "title": "$TR_TORRENT_NAME", \
  "body": "$TR_TORRENT_NAME completed."}'
Run Code Online (Sandbox Code Playgroud)

...除了它推送$TR_TORRENT_NAME而不是该变量的实际内容。

我需要逃避一些引用或什么吗?

Joh*_*024 85

在单引号内,shell 不展开任何内容。将它们放在双引号内:

curl -u <my-api-token>: \
  -X POST https://api.pushbullet.com/v2/pushes \
  --header 'Content-Type: application/json' \
  --data-binary '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", \
  "body": "'"$TR_TORRENT_NAME completed"'."}'
Run Code Online (Sandbox Code Playgroud)

让我们通过查看以下内容来检查它是如何工作的:

$ TR_TORRENT_NAME=MyTorrent
$ echo '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", "body": "'"$TR_TORRENT_NAME completed"'."}'
{"type": "note", "title": "MyTorrent", "body": "MyTorrent completed."}
Run Code Online (Sandbox Code Playgroud)

当 shell 变量出现时,它总是在双引号内。因此,它被适当地扩展。

这样的引用有点微妙。我们有单引号字符串,其中包含双引号作为字符,并且位于双引号字符串的旁边。为了更好地理解这一点,让我们以这个片段为例:

 "'"$TR_TORRENT_NAME"'"
Run Code Online (Sandbox Code Playgroud)

依次取每个字符:

  1. "是单引号字符串内的文字双引号字符。(为简洁起见,此片段中未显示此字符串的开头。)

  2. ' 关闭单引号字符串。

  3. " 打开一个双引号字符串。

  4. $TR_TORRENT_NAME 是在双引号内展开的 shell 变量。

  5. " 关闭双引号字符串。

  6. ' 打开一个新的单引号字符串。

  7. " 在单引号字符串中放置一个双引号字符。


小智 7

要在 bash 行curl 中包含环境变量而不在变量内容周围加上引号,这对我有用:

--header 'PRIVATE-TOKEN: '"$PRIVATE_TOKEN"''
Run Code Online (Sandbox Code Playgroud)

或者使用最初描述的在 body 字段周围不带引号的场景:

curl -u <my-api-token>: \
  -X POST https://api.pushbullet.com/v2/pushes \
  --header 'Content-Type: application/json' \
  --data-binary '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", \
  "body": '"$TR_TORRENT_NAME completed"'.}'
Run Code Online (Sandbox Code Playgroud)