Come includere la variabile d'ambiente nella riga bash CURL?


39

Tentativo di ricevere la trasmissione per avvisare quando il download è completo.

Questo funziona:

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

... tranne che spinge $TR_TORRENT_NAMEe non il contenuto effettivo di quella variabile.

Devo scappare da qualche citazione o qualcosa del genere?

Risposte:


58

All'interno di virgolette singole, la shell non espande nulla. Inseriscili invece tra virgolette doppie:

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

Esaminiamo come funziona osservando:

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

Quando appare la variabile shell, è sempre racchiusa tra virgolette. Di conseguenza, è correttamente espanso.

Citare in questo modo è un po 'sottile. Abbiamo stringhe a virgoletta singola che contengono virgolette doppie come caratteri e sono accanto a stringhe tra virgolette doppie. Per capirlo meglio, prendiamo questo frammento come esempio:

 "'"$TR_TORRENT_NAME"'"

Prendendo a turno ogni personaggio:

  1. "è un carattere letterale a doppia virgoletta che si trova all'interno di una stringa a virgoletta singola. (Per brevità, l'inizio di questa stringa non è mostrato in questo frammento.)

  2. ' chiude una stringa a virgoletta singola.

  3. " apre una stringa tra virgolette doppie.

  4. $TR_TORRENT_NAME è una variabile di shell che viene espansa tra virgolette doppie.

  5. " chiude la stringa tra virgolette doppie.

  6. ' apre una nuova stringa a virgoletta singola.

  7. " inserisce un carattere tra virgolette doppie nella stringa a virgoletta singola.


Hai bisogno dei passaggi 3 e 5?
davidfrancis,

@davidfrancis Se si omettono i passaggi 3 e 5, il passaggio 4 è soggetto alla suddivisione delle parole e all'espansione del percorso e l'uno o l'altro potrebbe causare problemi di qualsiasi tipo. A meno che uno non voglia esplicitamente la suddivisione delle parole e l' espansione del percorso , una variabile di shell dovrebbe essere sempre racchiusa tra virgolette.
Giovanni 1024

Grazie per quello, puoi fare un esempio veloce per favore? Ha funzionato nel mio esempio, ed è per questo che l'ho chiesto, ma non c'erano spazi o qualcos'altro di complesso
davidfrancis,

@davidfrancis Prova a TR_TORRENT_NAME="A * B"vedere cosa succede.
Giovanni 1024,

1

Per includere una variabile d'ambiente in un ricciolo della linea bash senza virgolette attorno al contenuto della variabile, questo ha funzionato per me:

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

O usando lo scenario che è stato descritto per la prima volta senza virgolette attorno al campo del corpo:

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"'.}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.