¿Cómo conservar los saltos de línea al almacenar la salida del comando en una variable?

104

Estoy usando bash shell en Linux. Tengo este sencillo guión ...

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

Sin embargo, cuando ejecuto este script

./temp.sh

toda la salida se imprime sin los retornos de carro / nuevas líneas. No estoy seguro de si es la forma en que estoy almacenando la salida en $ TEMP, o el comando echo en sí.

¿Cómo almaceno la salida del comando en una variable y conservo los saltos de línea / retornos de carro?

Dave
fuente
3
Están bien conservados en la variable (excepto por el último); es tu eco el que está roto. Ver mywiki.wooledge.org/BashPitfalls entrada n. ° 14
Charles Duffy
1
también, don'talmacenar commandsen variables. Usea functionen su lugar
han solo

Respuestas:

202

Cite sus variables. He aquí por qué:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

Sin comillas, el shell se reemplaza $TEMPpor los caracteres que contiene (uno de los cuales es una nueva línea). Luego, antes de invocar, el echoshell divide esa cadena en varios argumentos usando Internal Field Separator(IFS) y pasa la lista de argumentos resultante a echo. De forma predeterminada, IFSse establece en espacios en blanco (espacios, tabulaciones y líneas nuevas), por lo que el shell corta la $TEMPcadena en argumentos y nunca llega a ver la línea nueva, porque el shell lo considera un separador, como un espacio.

Jaypal Singh
fuente
xdotool type "$myVar"no funciona. todavía está escribiendo el contenido de la variable sin nuevas líneas
azerafati
¿Qué pasa si quieres hacer algo como FOO="$(echo $VAR)"; ¿Cómo se cita $VARcorrectamente cuando ya está entre comillas?
weberc2
@ weberc2 Simplemente citar de nuevo: "$(echo "$VAR")". Sí, es extraño analizarlo, pero aparentemente más fácil para los shells que para nosotros.
OJFord
3

Me he encontrado con el mismo problema, una cotización ayudará

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def
Beto
fuente
2
Responder una pregunta casi 5 años después sin agregar ningún detalle nuevo a las respuestas anteriores o brindar una nueva solución no es una buena idea; evite publicar este tipo de respuestas.
MAChitgarha
1
Amando la precisión de sus "casi 5 años", @MAChitgarha, :)
Neil Gatenby