Как включить переменную окружения в строку bash CURL?

40

Попытка получить передачу, чтобы уведомить, когда загрузка завершена.

Это работает:

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а не фактическое содержимое этой переменной

Нужно ли мне избежать какой-то цитаты или что-то?

Дэн
источник

Ответы:

59

Внутри одинарных кавычек оболочка ничего не расширяет. Поместите их в двойные кавычки:

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. " помещает символ двойной кавычки внутри строки в одинарных кавычках.

John1024
источник
Вам нужны шаги 3 и 5?
Давидфрансис
@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"'.}'
Бред нателборг
источник