web-dev-qa-db-ja.com

bash line 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をプッシュし、その変数の実際の内容はプッシュしません。

私はいくつかの引用や何かをエスケープする必要がありますか?

32
Dan

一重引用符の中では、シェルは何も展開しません。代わりにそれらを二重引用符で囲みます。

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は、二重引用符で囲まれたシェル変数です。

  5. "は、二重引用符で囲まれた文字列を閉じます。

  6. 'は、新しい一重引用符で囲まれた文字列を開きます。

  7. "は、一重引用符で囲まれた文字列の中に二重引用符を置きます。

52
John1024

変数の内容を引用符で囲まずにバッシュラインのカールに環境変数を含めるには、これは私にとって役に立ちました:

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