Làm thế nào để bao gồm biến môi trường trong dòng bash CURL?


39

Đang cố gắng để truyền tải để thông báo khi tải xuống hoàn tất.

Những công việc này:

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

... ngoại trừ nó đẩy $TR_TORRENT_NAMEvà không phải là nội dung thực tế của biến đó.

Tôi có cần phải thoát khỏi một số trích dẫn hoặc một cái gì đó?

Câu trả lời:


58

Bên trong dấu ngoặc đơn, vỏ mở rộng không có gì. Thay vào đó, đặt chúng trong dấu ngoặc kép:

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

Hãy xem xét cách thức hoạt động của nó bằng cách xem xét:

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

Khi biến shell xuất hiện, nó luôn nằm trong dấu ngoặc kép. Do đó, nó được mở rộng đúng cách.

Trích dẫn như thế này là một chút tinh tế. Chúng tôi có các chuỗi trích dẫn đơn có chứa các trích dẫn kép dưới dạng các ký tự và bên cạnh các chuỗi trích dẫn kép. Để hiểu rõ hơn về điều này, hãy lấy đoạn này làm ví dụ:

 "'"$TR_TORRENT_NAME"'"

Lần lượt lấy từng nhân vật:

  1. "là một ký tự trích dẫn kép theo nghĩa đen nằm trong một chuỗi trích dẫn đơn. (Để đơn giản, phần đầu của chuỗi này không được hiển thị trong đoạn này.)

  2. ' đóng một chuỗi trích dẫn duy nhất.

  3. " mở một chuỗi trích dẫn kép.

  4. $TR_TORRENT_NAME là một biến shell được mở rộng bên trong dấu ngoặc kép.

  5. " đóng chuỗi trích dẫn kép.

  6. ' mở một chuỗi trích dẫn đơn mới.

  7. " đặt một ký tự trích dẫn kép bên trong chuỗi trích dẫn đơn.


Bạn có cần bước 3 và 5 không?
davidfrancis

@davidfrancis Nếu bỏ qua bước 3 và 5, thì bước 4 có thể bị chia tách từmở rộng tên đường dẫn và một trong hai có thể gây ra tất cả sự cố. Trừ khi một người rõ ràng muốn tách từmở rộng tên đường dẫn , một biến shell phải luôn nằm trong dấu ngoặc kép.
John1024

Cảm ơn vì điều đó, bạn có thể cho một ví dụ nhanh xin vui lòng? Nó hoạt động theo ví dụ của riêng tôi, đó là lý do tại sao tôi hỏi, nhưng không có không gian hay bất cứ điều gì phức tạp khác trong đó
davidfrancis

@davidfrancis Hãy thử TR_TORRENT_NAME="A * B"và xem những gì sẽ xảy ra.
John1024

1

Để bao gồm một biến môi trường trong một dòng bash curl mà không có dấu ngoặc kép xung quanh nội dung biến, điều này làm việc cho tôi:

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

Hoặc sử dụng kịch bản được mô tả lần đầu tiên mà không có dấu ngoặc kép quanh trường cơ thể:

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"'.}'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.