Jak uwzględnić zmienną środowiskową w linii bash CURL?

39

Próba uzyskania transmisji, aby powiadomić o zakończeniu pobierania.

To działa:

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

... z wyjątkiem tego, że przesuwa, $TR_TORRENT_NAMEa nie rzeczywistą zawartość tej zmiennej.

Czy muszę uciec od jakiegoś cytatu lub czegoś takiego?

Dan
źródło

Odpowiedzi:

58

W pojedynczych cudzysłowach powłoka niczego nie rozwija. Zamiast tego umieść je w cudzysłowach:

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

Sprawdźmy, jak to działa, patrząc na:

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

Kiedy pojawia się zmienna powłoki, zawsze znajduje się w cudzysłowach. W związku z tym jest odpowiednio rozwinięty.

Cytowanie tego jest nieco subtelne. Mamy ciągi cudzysłowu, które zawierają znaki podwójnego cudzysłowu i są obok ciągów cudzysłowu. Aby to lepiej zrozumieć, weźmy ten fragment jako przykład:

 "'"$TR_TORRENT_NAME"'"

Biorąc kolejno każdą postać:

  1. "to dosłowny znak podwójnego cudzysłowu, który znajduje się w ciągu pojedynczego cudzysłowu. (Dla zwięzłości początek tego ciągu nie jest pokazany w tym fragmencie).

  2. ' zamyka ciąg cudzysłowu.

  3. " otwiera ciąg cudzysłowu.

  4. $TR_TORRENT_NAME jest zmienną powłoki, która jest rozwinięta w cudzysłowie.

  5. " zamyka ciąg cudzysłowu.

  6. ' otwiera nowy ciąg cudzysłowu.

  7. " umieszcza znak podwójnego cudzysłowu w ciągu pojedynczego cudzysłowu.

John1024
źródło
Czy potrzebujesz kroków 3 i 5?
davidfrancis
@davidfrancis Jeśli pominięto kroki 3 i 5, wówczas krok 4 podlega dzieleniu słów i rozwijaniu nazw ścieżek, a każde z nich może powodować wszelkie kłopoty. O ile ktoś wyraźnie nie chce dzielenia słów i rozwijania nazw ścieżek , zmienna powłoki powinna zawsze znajdować się w cudzysłowach.
John1024
Dzięki za to, czy możesz podać szybki przykład? Działa to na moim przykładzie i dlatego zapytałem, ale nie było tam żadnych spacji ani niczego innego
David
@davidfrancis Spróbuj TR_TORRENT_NAME="A * B"i zobacz, co się stanie.
John1024,
1

Aby włączyć zmienną środowiskową do zwijania linii bash bez cudzysłowów wokół zawartości zmiennej, działało to dla mnie:

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

Lub korzystając ze scenariusza, który został po raz pierwszy opisany bez cudzysłowów wokół pola treści:

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
źródło