Comment inclure la variable d'environnement dans la ligne bash CURL?

40

Essayer d'obtenir que Transmission vous avertisse lorsque le téléchargement est terminé.

Cela marche:

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

... sauf qu'il pousse $TR_TORRENT_NAMEet non le contenu réel de cette variable.

Dois-je échapper à une citation ou quelque chose?

Dan
la source

Réponses:

59

À l'intérieur des guillemets simples, le shell ne développe rien. Placez-les plutôt entre guillemets:

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

Examinons comment cela fonctionne en regardant:

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

Lorsque la variable shell apparaît, elle se trouve toujours entre guillemets doubles. Par conséquent, il est correctement développé.

Citer comme ça est un peu subtil. Nous avons des chaînes entre guillemets simples qui contiennent des guillemets doubles en tant que caractères et sont à côté des chaînes entre guillemets doubles. Pour mieux comprendre cela, prenons ce fragment comme exemple:

 "'"$TR_TORRENT_NAME"'"

Prendre chaque personnage à tour de rôle:

  1. "est un caractère entre guillemets littéral qui se trouve à l'intérieur d'une chaîne entre guillemets simples. (Par souci de concision, le début de cette chaîne n'est pas affiché dans ce fragment.)

  2. ' ferme une chaîne entre guillemets simples.

  3. " ouvre une chaîne entre guillemets doubles.

  4. $TR_TORRENT_NAME est une variable shell qui est développée entre guillemets doubles.

  5. " ferme la chaîne entre guillemets doubles.

  6. ' ouvre une nouvelle chaîne entre guillemets simples.

  7. " place un caractère entre guillemets dans la chaîne entre guillemets simples.

John1024
la source
Avez-vous besoin des étapes 3 et 5?
davidfrancis
@davidfrancis Si l'on omet les étapes 3 et 5, alors l'étape 4 est sujette au fractionnement de mots et à l' expansion du nom de chemin et l'une ou l'autre pourrait causer tous les problèmes du manoir. À moins que l'on veuille explicitement le fractionnement de mots et l' expansion du nom de chemin , une variable shell doit toujours être entre guillemets.
John1024
Merci pour cela, pouvez-vous donner un exemple rapide s'il vous plaît? Cela a fonctionné dans mon propre exemple, c'est pourquoi j'ai demandé, mais il n'y avait pas d'espaces ou de tout autre complexe là
dedans
@davidfrancis Essayez de TR_TORRENT_NAME="A * B"voir ce qui se passe.
John1024
1

Pour inclure une variable d'environnement dans une boucle de ligne bash sans guillemets autour du contenu de la variable, cela a fonctionné pour moi:

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

Ou en utilisant le scénario décrit pour la première fois sans guillemets autour du champ corporel:

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
la source