Як включити змінну середовища в рядок bash CURL?


39

Намагаються отримати передачу для сповіщення, коли завантаження завершено.

Це працює:

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"і подивіться, що станеться.
John1024

1

Щоб включити змінну середовища в завиток рядка bash без лапок навколо змінного вмісту, це працювало для мене:

--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"'.}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.