Wie wird die Umgebungsvariable in die Bash-Zeile CURL aufgenommen?

39

Versucht, Transmission zu benachrichtigen, wenn der Download abgeschlossen ist.

Das funktioniert:

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

... außer es drückt $TR_TORRENT_NAMEund nicht den tatsächlichen Inhalt dieser Variablen.

Muss ich mich einem Zitat entziehen oder so?

Dan
quelle

Antworten:

58

In einfachen Anführungszeichen erweitert die Shell nichts. Setzen Sie sie stattdessen in doppelte Anführungszeichen:

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

Schauen wir uns an, wie das funktioniert:

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

Wenn die Shell-Variable angezeigt wird, steht sie immer in doppelten Anführungszeichen. Folglich wird es richtig erweitert.

So zu zitieren ist etwas subtil. Wir haben Strings in einfachen Anführungszeichen, die doppelte Anführungszeichen als Zeichen enthalten und sich neben Strings in doppelten Anführungszeichen befinden. Um dies besser zu verstehen, nehmen wir dieses Fragment als Beispiel:

 "'"$TR_TORRENT_NAME"'"

Nehmen Sie jeden Charakter der Reihe nach:

  1. "ist ein wörtliches Anführungszeichen, das sich in einer Zeichenfolge in einfachen Anführungszeichen befindet. (Der Kürze halber wird der Anfang dieser Zeichenfolge in diesem Fragment nicht angezeigt.)

  2. ' Schließt eine Zeichenfolge in Anführungszeichen.

  3. " öffnet eine Zeichenfolge in doppelten Anführungszeichen.

  4. $TR_TORRENT_NAME ist eine Shell-Variable, die in doppelte Anführungszeichen gesetzt wird.

  5. " schließt die Zeichenfolge in doppelten Anführungszeichen.

  6. ' öffnet eine neue Zeichenfolge in Anführungszeichen.

  7. " Fügt ein doppeltes Anführungszeichen in die Zeichenfolge mit einfachen Anführungszeichen ein.

John1024
quelle
Benötigen Sie die Schritte 3 und 5?
Davidfrancis
@davidfrancis Wenn man die Schritte 3 und 5 auslässt, unterliegt Schritt 4 der Wortteilung und der Pfadnamenerweiterung, und jeder von beiden kann zu Problemen führen. Eine Shell-Variable sollte sich immer in doppelten Anführungszeichen befinden, es sei denn, man möchte explizit Wortteilung und Pfadnamenerweiterung .
John1024
Danke, können Sie bitte ein kurzes Beispiel geben? Es hat in meinem eigenen Beispiel funktioniert, weshalb ich gefragt habe, aber es waren keine Leerzeichen oder irgendetwas anderes Komplexes darin
davidfrancis
@davidfrancis Probieren TR_TORRENT_NAME="A * B"Sie aus, was passiert.
John1024
1

So fügen Sie eine Umgebungsvariable in eine Bash-Line-Locke ohne Anführungszeichen um den Variableninhalt ein:

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

Oder verwenden Sie das zuerst beschriebene Szenario ohne Anführungszeichen um das Feld 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"'.}'
Brad Natelborg
quelle