shell script imprimir contenido de la variable que contiene la salida de un comando elimina caracteres de nueva línea [duplicado]

StackOverflow https://stackoverflow.com/questions/1483721

  •  18-09-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Estoy escribiendo un script de shell que almacenará la salida de un comando en una variable, el proceso de la salida, y más tarde eco de los resultados. Esto es lo que tengo:

stuff=$(diff -u pens tape)
# process the output
echo $stuff

El problema es, la salida que recibo de la ejecución del script es el siguiente:

--- pens 2009-09-27 10:29:06.000000000 -0400 +++ tape 2009-09-18 16:45:08.000000000 -0400 @@ -1,4 +1,2 @@ -highlighter -marker -pencil -POSIX +masking +duct

Mientras que yo esperaba esto:

--- pens 2009-09-27 10:29:06.000000000 -0400
+++ tape 2009-09-18 16:45:08.000000000 -0400
@@ -1,4 +1,2 @@
-highlighter
-marker
-pencil
-POSIX
+masking
+duct

Parece que los caracteres de nueva línea se están retirando de alguna manera. ¿Cómo llego a decir en?

¿Fue útil?

Solución

Si desea conservar los saltos de línea, incluya la variable entre comillas dobles:

echo "$stuff"

Cuando se escribe sin las comillas dobles, la cáscara se expande $stuff en una lista separada por espacios de palabras (donde 'palabras' son secuencias de caracteres no espaciales, y los caracteres de espacio son espacios en blanco y las pestañas y saltos de línea; en la experimentación , parece que forma alimenta, retornos de carro y copia de los espacios no se cuentan como espacio).


La demostración de interpretación de los caracteres de control como espacios en blanco. ASCII 8 es la tecla de retroceso, 9 es pestaña, 10 es la nueva línea (LF), 11 es pestaña vertical, 12 es de avance de hoja 13 es retorno de carro. El primer comando genera una secuencia de caracteres separados por los diferentes caracteres de control. El segundo comando hace eco con el resultado con los personajes originales conservados - ver el volcado hexadecimal. El tercer comando hace eco el resultado con la división shell las palabras; se puede ver que la lengüeta y la nueva línea fueron reemplazados por blanco (0x20).

$ x=$(./ascii 64 65 8 66 67 9 68 69 10 70 71 11 72 73 12 74 75 13 76 77)
$ echo "$x" | odx
0x0000: 40 41 08 42 43 09 44 45 0A 46 47 0B 48 49 0C 4A   @A.BC.DE.FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ echo  $x  | odx
0x0000: 40 41 08 42 43 20 44 45 20 46 47 0B 48 49 0C 4A   @A.BC DE FG.HI.J
0x0010: 4B 0D 4C 4D 0A                                    K.LM.
0x0015:
$ 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top