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


39

尝试让Transmission通知下载完成。

这有效:

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."}'

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

我需要转义一些报价吗?

Answers:


58

在单引号内,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"'."}'

让我们通过查看以下内容来检查其工作原理:

$ TR_TORRENT_NAME=MyTorrent
$ echo '{"type": "note", "title": "'"$TR_TORRENT_NAME"'", "body": "'"$TR_TORRENT_NAME completed"'."}'
{"type": "note", "title": "MyTorrent", "body": "MyTorrent completed."}

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

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

 "'"$TR_TORRENT_NAME"'"

依次轮流使用每个字符:

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

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

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

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

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

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

  7. " 在单引号字符串内放置双引号字符。


您需要步骤3和5吗?
davidfrancis

@davidfrancis如果省略第3步和第5步,则第4步将进行单词拆分路径名扩展,并且任何一个都可能引起麻烦。除非明确要求分扩展路径名,否则shell变量应始终在双引号内。
John1024 '18

谢谢你,你能举个简单的例子吗?它以我自己的示例运行,这就是为什么我问这个原因,但是那里没有空格或其他任何复杂的东西
davidfrancis

@davidfrancis尝试TR_TORRENT_NAME="A * B"看看会发生什么。
John1024 '18

1

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

--header 'PRIVATE-TOKEN: '"$PRIVATE_TOKEN"''

或使用最初在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"'.}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.