Como incluir variável de ambiente na linha do bash CURL?

39

Tentando receber a Transmissão para notificar quando o download for concluído.

Isso funciona:

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

... exceto que empurra $TR_TORRENT_NAMEe não o conteúdo real dessa variável.

Preciso escapar de alguma citação ou algo assim?

Dan
fonte

Respostas:

58

Dentro de aspas simples, o shell não expande nada. Coloque-os entre aspas duplas:

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

Vamos examinar como isso funciona, observando:

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

Quando a variável shell aparece, ela está sempre entre aspas duplas. Consequentemente, é adequadamente expandido.

Citar assim é um pouco sutil. Temos cadeias de citação simples que contêm aspas duplas como caracteres e são próximas a cadeias de citação dupla. Para entender isso melhor, tomemos este fragmento como um exemplo:

 "'"$TR_TORRENT_NAME"'"

Tomando cada personagem por vez:

  1. "é um caractere de aspas duplas literal que está dentro de uma string de aspas simples. (Por uma questão de brevidade, o início dessa string não é mostrado neste fragmento.)

  2. ' fecha uma sequência de aspas simples.

  3. " abre uma cadeia de caracteres entre aspas duplas.

  4. $TR_TORRENT_NAME é uma variável de shell que é expandida entre aspas duplas.

  5. " fecha a cadeia de caracteres entre aspas duplas.

  6. ' abre uma nova sequência de aspas simples.

  7. " coloca um caractere de aspas duplas dentro da string de aspas simples.

John1024
fonte
Você precisa das etapas 3 e 5?
Davidfrancis
@davidfrancis Se alguém omitir as etapas 3 e 5, a etapa 4 estará sujeita à divisão de palavras e à expansão do nome do caminho e qualquer uma delas poderá causar todo o problema. A menos que alguém deseje explicitamente a divisão de palavras e a expansão do nome do caminho , uma variável do shell sempre deve estar entre aspas duplas.
precisa saber é o seguinte
Obrigado por isso, você pode dar um exemplo rápido, por favor? Funcionou no meu próprio exemplo, e foi por isso que perguntei, mas não havia espaços ou qualquer outra coisa complexa lá dentro
davidfrancis
@davidfrancis Experimente TR_TORRENT_NAME="A * B"e veja o que acontece.
precisa saber é o seguinte
1

Para incluir uma variável de ambiente em uma ondulação de linha de base sem aspas no conteúdo da variável, isso funcionou para mim:

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

Ou usando o cenário descrito pela primeira vez sem aspas no campo do 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"'.}'
Brad Natelborg
fonte