2009-09-27 4 views
6

Sto scrivendo uno script di shell che memorizzerà l'output di un comando in una variabile, elaborerà l'output e in seguito farà eco ai risultati. Ecco quello che ho:Il contenuto della stampa di script della shell di una variabile contenente l'output di un comando rimuove i caratteri di nuova riga

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

Il problema è che l'uscita che ricevo da l'esecuzione dello script è questo:

--- 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 

Mentre mi aspettavo questo:

--- 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 

E ' sembra che i personaggi di nuova riga siano stati rimossi in qualche modo. Come faccio a farglielo dire?

risposta

17

Se si desidera conservare le nuove righe, racchiudere la variabile tra virgolette:

echo "$stuff" 

Quando si scrive senza le virgolette, la shell espande $stuff in un elenco separato da spazi di parole (dove ' le parole "sono sequenze di caratteri non spaziali e i caratteri spaziali sono spazi vuoti e tabulazioni e nuove righe: alla sperimentazione sembra che i feed di forma, i ritorni a capo e gli spazi posteriori non contino come spazio).


Dimostrazione dell'interpretazione dei caratteri di controllo come spazio bianco. ASCII 8 è backspace, 9 è tab, 10 è new line (LF), 11 è tab verticale, 12 è form feed, 13 è carriage return. Il primo comando genera una sequenza di caratteri separati dai vari caratteri di controllo. Il secondo comando echeggia con il risultato con i caratteri originali preservati - vedi il dump esadecimale. Il terzo comando fa eco al risultato con la shell che divide le parole; puoi vedere che il tab e il newline sono stati sostituiti da vuoto (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: 
$ 
+0

Jonathan ha ragione. La ragione per cui la shell rimuoverà altrimenti lo spazio bianco per te .. –

Problemi correlati