shell-script – pasar y configurar variables en un heredoc

Pregunta:

Tengo un script que tiene que hacer muchas cosas diferentes en muchas máquinas remotas diferentes. Pensé que un heredoc funcionaría para esto, pero no puedo usar una variable definida en otra parte del script y una definida en el heredoc.

Aquí hay un código:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF

Esto solo imprime lo siguiente:

FOO =

BAR = barra

Sin embargo, si cito la línea EOF de esta manera: ssh some.remote.host << "EOF" , solo imprime lo siguiente:

FOO = foo

BAR =

¿Alguna sugerencia sobre cómo puedo usar ambas variables dentro del heredoc?

Gracias.

Respuesta:

En resumen, use:

  • Palabras clave de heredoc sin comillas, p. ej., EOF
  • Char de dólar regular para variables externas (es decir, locales ), por ejemplo, $FOO
  • carácter de dólar escapado para variables internas (es decir, remotas ), por ejemplo, \$BAR

Si deja la palabra clave heredoc (es decir, EOF ) sin comillas, el cuerpo de heredoc se procesa localmente, de modo que $FOO se expande a foo y BAR se expande a la cadena vacía. Entonces su comando ssh convierte en:

BAR="bar"
echo "FOO=foo"
echo "BAR="

Si cita la palabra clave heredoc, la expansión de la variable se suprime, de modo que su comando ssh convierte en este en su lugar:

BAR="bar"
echo "FOO=$FOO"
echo "BAR=$BAR"

Dado que probablemente FOO no esté definido en el entorno de shell remoto, la expresión "FOO=$FOO" se evalúa como "FOO=''" , es decir, FOO se establece en la cadena vacía.

Si desea usar ambas variables, deberá dejar la palabra clave heredoc sin comillas, de modo que la expansión de la variable tenga lugar para la variable definida localmente, y luego escapar (con una barra invertida) la variable que desea expandir de forma remota, es decir :

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=\$BAR"
EOF

En este caso, su comando ssh (tal como lo recibe el servidor remoto) será el siguiente:

  BAR="bar"
  echo "FOO=foo"
  echo "BAR=$BAR"

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım