2009-09-27 3 views
6

Ich schreibe ein Shell-Skript, das die Ausgabe eines Befehls in einer Variablen speichert, die Ausgabe verarbeitet und später die Ergebnisse ausgibt. Hier ist, was ich habe:Shell-Skript druckt Inhalt der Variablen, die die Ausgabe eines Befehls enthält, löscht Zeilenumbrüche

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

Das Problem ist, das Ausgangssignal I 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 so aus, als ob die Zeilenumbruchzeichen irgendwie entfernt werden. Wie bekomme ich sie dazu, zu sagen?

Antwort

17

Wenn Sie die Zeilenumbrüche zu erhalten, wird die Variable in doppelten Anführungszeichen ein:

echo "$stuff" 

Wenn Sie es ohne die doppelten Anführungszeichen schreiben, die Shell erweitert $stuff in eine durch Leerzeichen getrennte Liste von Worten (wobei " Wörter 'sind Sequenzen von Nicht-Leerzeichen-Zeichen, und die Leerzeichen sind Leer- und Tabulatoren sowie Zeilenumbrüche. Beim Experimentieren scheint es so zu sein, dass Seitenvorschübe, Wagenrückläufe und Rückräume nicht als Leerzeichen gezählt werden.


Demonstration der Interpretation von Steuerzeichen als Leerraum. ASCII 8 ist Rücktaste, 9 ist Tab, 10 ist neue Zeile (LF), 11 ist vertikale Registerkarte, 12 ist Form Feed, 13 ist Wagenrücklauf. Der erste Befehl generiert eine Folge von Zeichen, die durch die verschiedenen Steuerzeichen getrennt sind. Der zweite Befehl wird mit dem Ergebnis echotiert, wobei die ursprünglichen Zeichen erhalten bleiben - siehe Hexadezimalspeicher. Der dritte Befehl gibt das Ergebnis wieder, wobei die Shell die Wörter aufteilt; Sie können sehen, dass Tab und Newline durch Leerzeichen (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: 
$ 
+0

Jonathan hat Recht. Der Grund dafür ist, dass die Shell ansonsten den Leerraum für Sie entfernt. –

Verwandte Themen