Bagaimana cara memasukkan variabel lingkungan dalam garis bash CURL?

39

Mencoba mendapatkan Transmisi untuk memberi tahu saat unduhan selesai.

Ini bekerja:

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

... kecuali itu mendorong $TR_TORRENT_NAMEdan bukan isi sebenarnya dari variabel itu.

Apakah saya perlu menghindari beberapa kutipan atau sesuatu?

Dan
sumber

Jawaban:

58

Di dalam tanda kutip tunggal, shell tidak memperluas apa pun. Tempatkan mereka di dalam tanda kutip ganda sebagai gantinya:

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

Mari kita periksa bagaimana ini bekerja dengan melihat:

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

Ketika variabel shell muncul, itu selalu di dalam tanda kutip ganda. Akibatnya, itu diperluas dengan benar.

Mengutip seperti ini agak halus. Kami memiliki string dengan kutip tunggal yang berisi tanda kutip ganda sebagai karakter dan berada di sebelah string yang dikutip ganda. Untuk memahami ini dengan lebih baik, mari kita ambil fragmen ini sebagai contoh:

 "'"$TR_TORRENT_NAME"'"

Mengambil setiap karakter secara bergantian:

  1. "adalah karakter kutipan ganda harfiah yang ada di dalam string yang dikutip tunggal. (Untuk singkatnya, awal string ini tidak ditampilkan dalam fragmen ini.)

  2. ' menutup string yang dikutip tunggal.

  3. " membuka string yang dikutip ganda.

  4. $TR_TORRENT_NAME adalah variabel shell yang diperluas di dalam tanda kutip ganda.

  5. " menutup string yang dikutip ganda.

  6. ' membuka string baru yang dikutip tunggal.

  7. " menempatkan karakter tanda kutip ganda di dalam string tanda kutip tunggal.

John1024
sumber
Apakah Anda memerlukan langkah 3 dan 5?
davidfrancis
@davidfrancis Jika seseorang menghilangkan langkah 3 dan 5, maka langkah 4 tunduk pada pemisahan kata dan perluasan pathname dan salah satu dapat menyebabkan semua masalah besar. Kecuali satu secara eksplisit menginginkan pemisahan kata dan perluasan pathname , variabel shell harus selalu berada di dalam tanda kutip ganda.
John1024
Terima kasih untuk itu, bisakah Anda memberikan contoh cepat? Itu bekerja dalam contoh saya sendiri, itulah sebabnya saya bertanya, tetapi tidak ada ruang atau hal lain yang kompleks di sana
davidfrancis
@davidfrancis Cobalah TR_TORRENT_NAME="A * B"dan lihat apa yang terjadi.
John1024
1

Untuk memasukkan variabel lingkungan dalam ikal garis bash tanpa tanda kutip di sekitar konten variabel, ini berhasil bagi saya:

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

Atau menggunakan skenario yang pertama kali dijelaskan tanpa tanda kutip di sekitar bidang tubuh:

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