¿Cómo asignar un valor heredoc a una variable en Bash?
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...
Puede evitar un uso inútil cat
y 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.
Utilice $() para asignar la salida de cat
a 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-this
no se ejecutará.
Tenga en cuenta que el delimitador final de heredoc END_HEREDOC
debe estar solo en la línea (por lo tanto, el paréntesis final )
está en la siguiente línea).
Gracias a @ephemient
por la respuesta.