Shell script di stampa contenuto della variabile contenente output di un comando rimuove caratteri di nuova riga [duplicato]
Domanda
Questa domanda ha già una risposta qui:
Sto scrivendo uno script di shell che memorizza l'output di un comando in una variabile di processo all'uscita, e successivamente eco i risultati. Ecco quello che ho:
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
Sembra che i caratteri di nuova riga vengono rimossi in qualche modo. Come faccio ad avere loro di dire in?
Soluzione
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 'parole' sono sequenze di caratteri non spaziali, ei caratteri di spazio sono spazi e tabulazioni e ritorni a capo; upon sperimentazione , sembra che forma i ritorni a capo e back-spazi non sono conteggiati come spazio).
A dimostrazione interpretazione dei caratteri di controllo come lo spazio bianco. ASCII 8 è backspace, 9 è scheda, 10 è nuova riga (LF), 11 è scheda verticale, 12 è avanzamento modulo 13 è ritorno del carrello. Il primo comando genera una sequenza di caratteri separati dai vari caratteri di controllo. Il secondo comando fa eco con il risultato con i caratteri originali conservati - vedere il dump esadecimale. Il terzo comando riprende il risultato con il guscio splitting le parole; si può vedere che la scheda e la nuova linea 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:
$