¿Cómo asignar un valor heredoc a una variable en Bash?

Resuelto Neil asked hace 15 años • 14 respuestas

Tengo esta cadena de varias líneas (comillas incluidas):

abc'asdf"
$(dont-execute-this)
foo"bar"''

¿Cómo lo asignaría a una variable usando un heredoc en Bash?

Necesito preservar las nuevas líneas.

No quiero escapar de los caracteres de la cadena, eso sería molesto...

Neil avatar Jul 23 '09 02:07 Neil
Aceptado

Puede evitar un uso inútil caty manejar mejor las comillas no coincidentes con esto:

$ read -r -d '' VAR <<'EOF'
abc'asdf"
$(dont-execute-this)
foo"bar"''
EOF

Si no cita la variable cuando la repite, las nuevas líneas se pierden. Citarlos los conserva:

$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

Si desea utilizar sangría para facilitar la lectura en el código fuente, utilice un guión después del menor. La sangría debe realizarse utilizando únicamente tabuladores (sin espacios).

$ read -r -d '' VAR <<-'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
    EOF
$ echo "$VAR"
abc'asdf"
$(dont-execute-this)
foo"bar"''

Si, en cambio, desea conservar las pestañas en el contenido de la variable resultante, debe eliminar la pestaña de IFS. El marcador de terminal para el documento aquí ( EOF) no debe tener sangría.

$ IFS='' read -r -d '' VAR <<'EOF'
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''
EOF
$ echo "$VAR"
    abc'asdf"
    $(dont-execute-this)
    foo"bar"''

Las pestañas se pueden insertar en la línea de comando presionando Ctrl- V Tab. Si está utilizando un editor, dependiendo de cuál, también puede funcionar o puede que tenga que desactivar la función que convierte automáticamente las pestañas en espacios.

Dennis Williamson avatar Oct 31 '2009 19:10 Dennis Williamson

Utilice $() para asignar la salida de cata su variable de esta manera:

VAR=$(
cat <<'END_HEREDOC'
abc'asdf"
$(dont-execute-this)
foo"bar"''
END_HEREDOC
)

# this will echo variable with new lines intact
echo "$VAR"
# this will echo variable without new lines (changed to space character)
echo $VAR

Asegúrate de delimitar el inicio END_HEREDOC con comillas simples. Esto evitará que se expanda el contenido del heredoc, por lo que dont-execute-thisno se ejecutará.

Tenga en cuenta que el delimitador final de heredoc END_HEREDOCdebe estar solo en la línea (por lo tanto, el paréntesis final )está en la siguiente línea).

Gracias a @ephemientpor la respuesta.

Neil avatar Jul 22 '2009 20:07 Neil