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 hassaltos 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 comandocden 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" `.evalestos métodos, pero no lo rastreé porque era parte de un paquete queevalcontiene 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
caty 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 porquereaddevuelve un código de retorno distinto de cero cuando alcanza EOF.set -ey siempre recomiendo su uso. En su lugar, es mejor usar un manejo de errores adecuado.trapes tu amigo. Otros amigos:elsey||entre otros.catRealmente vale la pena evitarlo en tal caso? Asignar un heredoc a una variable concates un idioma muy conocido. De alguna manera, el usoreadofusca cosas por pequeños beneficios en mi humilde opinión.dy la cadena vacía;bashse derrumba-rd''a simplemente-rdantes dereadver sus argumentos, por lo queVARse trata como el argumento para-d.readregresará 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
cata su variable de esta manera:Asegurarse de delimitar el inicio de END_HEREDOC con comillas simples.
Tenga en cuenta que terminando aquí delimitador
END_HEREDOCdebe estar solo en la línea (por lo tanto, el paréntesis final está en la línea siguiente).Gracias a
@ephemientpor la respuesta.fuente
echo "$VAR"en lugar deecho $VAR.ashy OpenWRT dondereadno 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 -euy acentos abiertos no apareados , pero no han sido evaluados muy bien:fuente
readbucle en la función, para evitar el-d ''bashism necesario para preservar nuevas líneas).set -eset, mientras que la respuesta seleccionada no. Parece ser debido ahttp://unix.stackexchange.com/a/265151/20650no 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 newlinesecho "$VAR" # preserves newlinesfuente
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
readsoluciones 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