61 votes

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

J'essaie d'obtenir une notification de Transmission lorsque le téléchargement est terminé.

Ça 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_NAME et non le contenu réel de cette variable.

Est-ce que je dois échapper à une citation ou autre ?

94voto

John1024 Points 15663

À l'intérieur des guillemets simples, le Shell n'étend rien. Placez-les plutôt à l'intérieur de guillemets doubles :

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 est toujours entre guillemets. Par conséquent, elle est correctement développée.

Une citation comme celle-ci est un peu subtile. Nous avons des chaînes de caractères entre guillemets simples qui contiennent des guillemets doubles en tant que caractères et qui se trouvent à côté de chaînes de caractères entre guillemets doubles. Pour mieux comprendre, prenons ce fragment comme exemple :

 "'"$TR_TORRENT_NAME"'"

Prendre chaque personnage à tour de rôle :

  1. " est un caractère double guillemet littéral qui se trouve à l'intérieur d'une chaîne de caractères simple guillemet. (Par souci de brièveté, le début de cette chaîne n'est pas représenté dans ce fragment).

  2. ' ferme une chaîne de caractères entre guillemets.

  3. " ouvre une chaîne de caractères entre guillemets.

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

  5. " ferme la chaîne de caractères entre guillemets.

  6. ' ouvre une nouvelle chaîne de caractères entre guillemets.

  7. " place un caractère entre guillemets à l'intérieur de la chaîne de caractères entre guillemets.

4voto

Brad Natelborg Points 41

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

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

Ou en utilisant le scénario décrit en premier lieu, sans guillemets autour du champ "body" :

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

0voto

Walker Rowe Points 111

Le plus simple est de mettre des guillemets à la fin et des guillemets doubles autour de la variable d'environnement :

  1. Initialiser et exporter la variable-

     export TR_TORRENT_NAME="foo"
  2. Importez la variable-

     echo  "{"type": "note", "title": ""$TR_TORRENT_NAME"", "body": ""$TR_TORRENT_NAME"" "completed."}"
  3. La réponse ressemblerait à-

     {type: note, title: foo, body: foo completed.}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X