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?

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.


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"'.}'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.