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その変数の実際の内容ではなく、プッシュすることを除いて。

引用などをエスケープする必要がありますか?

回答:


58

シングルクォート内では、シェルは何も展開しません。代わりに二重引用符で囲みます:

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

シェル変数が現れるとき、それは常に二重引用符の中にあります。その結果、適切に展開されます。

このような引用は少し微妙です。文字として二重引用符を含み、二重引用符で囲まれた文字列の隣にある単一引用符で囲まれた文字列があります。これをよりよく理解するために、このフラグメントを例としてみましょう。

 "'"$TR_TORRENT_NAME"'"

各キャラクターを順番に撮影する:

  1. "単一引用符で囲まれた文字列内にあるリテラルの二重引用符です。(簡潔にするために、この文字列の先頭はこのフラグメントには示されていません。)

  2. ' 一重引用符で囲まれた文字列を閉じます。

  3. " 二重引用符で囲まれた文字列を開きます。

  4. $TR_TORRENT_NAME 二重引用符で囲まれたシェル変数です。

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

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

  7. " 一重引用符で囲まれた文字列内に二重引用符を配置します。


手順3と5が必要ですか?
-davidfrancis

@davidfrancisステップ3と5を省略すると、ステップ4は単語の分割パス名の拡張の対象となり、いずれかがすべてのトラブルの原因となります。単語の分割パス名の展開を明示的に必要としない限り、シェル変数は常に二重引用符で囲む必要があります。
John1024

そのおかげで、簡単な例を挙げてください。それは私自身の例で働いたので、私は尋ねましたが、そこにはスペースや他の複雑なものはありません
でした-davidfrancis

@davidfrancis TR_TORRENT_NAME="A * B"何が起こるか試してみてください。
ジョン1024

1

変数の内容を引用符なしで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"'.}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.