Tengo esta cadena de varias líneas (citas incluidas):
abc'asdf"
$(dont-execute-this)
foo"bar"''
¿Cómo lo asignaría a una variable usando un heredoc en Bash?
Necesito preservar nuevas líneas.
No quiero escapar de los caracteres en la cadena, eso sería molesto ...
'EOF'
, con` in the content: if the second line has
saltos de línea escapados con el comando cd`, vuelvo: " .sh: línea X: cd: comando no encontrado "; pero si hago comillas dobles"EOF"
; entonces las variables bash${A}
no se conservan como cadenas (se expanden); pero luego, los saltos de línea se conservan, y no tengo ningún problema al ejecutar un comandocd
en la segunda línea ( y tanto 'EOF' como "EOF" parecen funcionar bien también coneval
, para ejecutar un conjunto de comandos almacenados en una variable de cadena ). ¡Salud!"EOF"
variable de doble qouted , si se llama víaeval $VAR
, hará que se comente todo el resto del script, ya que aquí $ VAR se verá como una sola línea ; para poder usar#
comentarios bash en un script multilínea, la comilla doble también es variable en eleval call:
eval "$ VAR" `.eval
estos métodos, pero no lo rastreé porque era parte de un paquete queeval
contiene algunas variables definidas en su archivo de configuración. Mensaje de error fue:/usr/lib/network/network: eval: line 153: syntax error: unexpected end of file
. Acabo de cambiar a otra solución.Respuestas:
Puede evitar un uso inútil de
cat
y manejar mejor las citas no coincidentes con esto:Si no cita la variable cuando la repite, se pierden las nuevas líneas. Citarlo los preserva:
Si desea utilizar la sangría para facilitar la lectura en el código fuente, use un guión después de la menor thans. La sangría debe hacerse usando solo pestañas (sin espacios).
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.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, eso también puede funcionar o puede que tenga que desactivar la función que convierte automáticamente las pestañas en espacios.
fuente
set -o errexit
(akaset -e
) en su script y lo usa, entonces terminará su script porqueread
devuelve un código de retorno distinto de cero cuando alcanza EOF.set -e
y siempre recomiendo su uso. En su lugar, es mejor usar un manejo de errores adecuado.trap
es tu amigo. Otros amigos:else
y||
entre otros.cat
Realmente vale la pena evitarlo en tal caso? Asignar un heredoc a una variable concat
es un idioma muy conocido. De alguna manera, el usoread
ofusca cosas por pequeños beneficios en mi humilde opinión.d
y la cadena vacía;bash
se derrumba-rd''
a simplemente-rd
antes deread
ver sus argumentos, por lo queVAR
se trata como el argumento para-d
.read
regresará con un código de salida distinto de cero. Esto hace que este método sea menos que ideal en un script con comprobación de errores habilitada (pset -e
. Ej .).Use $ () para asignar la salida de
cat
a su variable de esta manera:Asegurarse de delimitar el inicio de END_HEREDOC con comillas simples.
Tenga en cuenta que terminando aquí delimitador
END_HEREDOC
debe estar solo en la línea (por lo tanto, el paréntesis final está en la línea siguiente).Gracias a
@ephemient
por la respuesta.fuente
echo "$VAR"
en lugar deecho $VAR
.ash
y OpenWRT donderead
no es compatible-d
.Esta es una variación del método Dennis, se ve más elegante en los guiones.
definición de función:
uso:
disfrutar
ps hizo un versión de 'lectura de bucle' para shells que no son compatibles
read -d
. debe trabajar conset -eu
y acentos abiertos no apareados , pero no han sido evaluados muy bien:fuente
read
bucle en la función, para evitar el-d ''
bashism necesario para preservar nuevas líneas).set -e
set, mientras que la respuesta seleccionada no. Parece ser debido ahttp://unix.stackexchange.com/a/265151/20650
no funciona porque está redirigiendo stdin a algo que no le importa, es decir, la asignación
funciona, pero hay un tic de respaldo que puede evitar que lo uses. Además, realmente debe evitar el uso de backticks, es mejor usar la notación de sustitución de comandos
$(..)
.fuente
$(cat <<'END'
lugar. @Neil: La última línea nueva no será parte de la variable, pero el resto se conservará.echo "$A"
(es decir, poner $ A entre comillas dobles) y usted ve las nuevas líneas!REM=<< 'REM' ... comment block goes here ... REM
. O de forma más compacta,: << 'REM' ...
. Donde "REM" podría ser algo así como "NOTAS" o "SCRATCHPAD", etc.Esto no es cierto: probablemente te esté engañando el comportamiento del eco:
echo $VAR # strips newlines
echo "$VAR" # preserves newlines
fuente
Ramificando la respuesta de Neil , a menudo no necesita una var en absoluto, puede usar una función de la misma manera que una variable y es mucho más fácil de leer que las
read
soluciones en línea o basadas.fuente
Una matriz es una variable, por lo que en ese caso funcionará mapfile
Entonces puedes imprimir así
fuente
asignar un valor heredoc a una variable
usado como argumento de un comando
fuente
echo "$VAR"
Me encontré teniendo que leer una cadena con NULL, así que aquí hay una solución que leerá todo lo que le arrojes. Aunque si en realidad estás lidiando con NULL, tendrás que lidiar con eso en el nivel hexadecimal.
$ cat> read.dd.sh
Prueba:
Ejemplo de HEREDOC (con ^ J, ^ M, ^ I):
fuente
Gracias a la respuesta de dimo414 , esto muestra cómo funciona su gran solución, y muestra que también puede tener comillas y variables en el texto fácilmente:
salida de ejemplo
test.sh
fuente
fuente