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

28

Tentando fazer com que a Transmissão notifique 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 ele envia $TR_TORRENT_NAME e não o conteúdo real dessa variável.

Eu preciso escapar de alguma citação ou algo assim?

    
por Ze'ev 04.11.2014 / 03:44

2 respostas

42

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 analisando:

$ 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 strings com aspas simples que contêm aspas duplas como caracteres e estão ao lado de strings com aspas duplas. Para entender melhor, vamos pegar este fragmento como um exemplo:

 "'"$TR_TORRENT_NAME"'"

Tomando cada caractere por vez:

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

  2. ' fecha uma string entre aspas simples.

  3. " abre uma sequência de aspas duplas.

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

  5. " fecha a sequência de aspas duplas.

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

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

por 04.11.2014 / 03:50
1

Para incluir uma variável de ambiente em uma curva de linha bash sem aspas ao redor do 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 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"'.}'
    
por 26.09.2018 / 19:58