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

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

尝试让 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不是该变量的实际内容。

我需要逃避一些引言或者别的什么吗?

答案1

在单引号内,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. "将双引号字符放置在单引号字符串内。

答案2

要在 bash 行 curl 中包含环境变量,并且变量内容周围没有引号,这对我来说是有效的:

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

或者使用首先描述的在主体字段周围不带引号的场景:

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

答案3

将引号放在末尾并用双引号括住环境变量是最简单的方法:

  1. 初始化并导出变量-

     export TR_TORRENT_NAME="foo"
    
  2. 导入变量-

     echo  "{"type": "note", "title": ""$TR_TORRENT_NAME"", "body": ""$TR_TORRENT_NAME"" "completed."}"
    
  3. 响应看起来是这样的-

     {type: note, title: foo, body: foo completed.}
    

相关内容