¿Cómo incluir la variable de entorno en bash line CURL?


39

Intentando que Transmission notifique cuando se complete la descarga.

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

... excepto que empuja $TR_TORRENT_NAMEy no el contenido real de esa variable.

¿Necesito escapar de alguna cita o algo?

Respuestas:


58

Dentro de las comillas simples, el shell no expande nada. Colóquelos dentro de comillas dobles:

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

Examinemos cómo funciona esto mirando:

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

Cuando aparece la variable de shell, siempre está entre comillas dobles. En consecuencia, se expande adecuadamente.

Citar así es un poco sutil. Tenemos cadenas de comillas simples que contienen comillas dobles como caracteres y están al lado de las cadenas de comillas dobles. Para entender esto mejor, tomemos este fragmento como ejemplo:

 "'"$TR_TORRENT_NAME"'"

Tomando cada personaje por turno:

  1. "es un carácter de comillas dobles literal que está dentro de una cadena entre comillas simples. (Por brevedad, el comienzo de esta cadena no se muestra en este fragmento).

  2. ' cierra una cadena entre comillas simples.

  3. " abre una cadena entre comillas dobles.

  4. $TR_TORRENT_NAME es una variable de shell que se expande entre comillas dobles.

  5. " cierra la cadena entre comillas dobles.

  6. ' abre una nueva cadena entre comillas simples.

  7. " coloca un carácter de comillas dobles dentro de la cadena entre comillas simples.


¿Necesitas los pasos 3 y 5?
davidfrancis

@davidfrancis Si uno omite los pasos 3 y 5, entonces el paso 4 está sujeto a la división de palabras y la expansión del nombre de ruta y cualquiera de los dos podría causar toda una serie de problemas. A menos que uno quiera explícitamente la división de palabras y la expansión del nombre de ruta , una variable de shell siempre debe estar entre comillas dobles.
John1024

Gracias por eso, ¿puedes dar un ejemplo rápido por favor? Se trabajó en mi propio ejemplo, que es por lo pregunté, pero no hubo espacios o cualquier otra cosa compleja ahí
davidfrancis

@davidfrancis Intenta TR_TORRENT_NAME="A * B"ver qué pasa.
John1024

1

Para incluir una variable de entorno en una curva de línea bash sin comillas alrededor del contenido de la variable, esto funcionó para mí:

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

O usando el escenario que se describió por primera vez sin comillas alrededor del campo del cuerpo:

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"'.}'
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.