Shell script di stampa contenuto della variabile contenente output di un comando rimuove caratteri di nuova riga [duplicato]

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

  •  18-09-2019
  •  | 
  •  

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?

È stato utile?

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:
$ 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top