Shell-Skript Inhalt der Variablen Druck Ausgabe eines Befehls enthält, entfernt Zeilenumbrüche [Duplikat]

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

  •  18-09-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich schreibe einen Shell-Skript, das die Ausgabe eines Befehls in einer Variablen gespeichert werden, verarbeitet die Ausgabe, und später die Ergebnisse Echo. Hier ist, was ich habe:

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

Das Problem ist, dass ich die Ausgabe von der Ausführung des Skripts zu bekommen, ist dies:

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

Während ich dies erwartet hatte:

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

Es sieht aus wie die Zeilenumbrüche irgendwie entfernt werden. Wie bekomme ich sie in sagen?

War es hilfreich?

Lösung

Wenn Sie die Zeilenumbrüche zu erhalten, setzen Sie das Variable in doppelten Anführungszeichen:

echo "$stuff"

Wenn Sie es ohne die doppelte Anführungszeichen schreiben, dehnt sich die Schale $stuff in eine durch Leerzeichen getrennte Liste von Wörtern (wo die Worte "sind Sequenzen von nicht-Leerzeichen und die Leerzeichen sind Leerzeichen und Tabulatoren und Zeilenumbrüchen, auf Experimente scheint es, dass Form-Feeds, Zeilenumbrüche und Back-Räume werden als Raum nicht gezählt).


Demonstrieren Interpretation von Steuerzeichen als weißer Raum. 8 ASCII ist Backspace, 9 Lasche 10 neue Zeile (LF) ist, 11 vertikale Lasche 12 Formularvorschub ist, 13 Wagenrücklauf ist. Der erste Befehl erzeugt eine Folge von Zeichen, die durch die verschiedenen Steuerzeichen getrennt. Der zweite Befehl hallt mit dem Ergebnis, mit den Original-Zeichen erhalten - das Hex-Dump sehen. Der dritte Befehl spiegelt das Ergebnis mit dem Shell-Splitting der Worte; Sie können sehen, dass die Lasche und Newline durch Leer (0x20) ersetzt wurden.

$ 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:
$ 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top