2009-09-27 7 views
6

Piszę skrypt powłoki, który przechowuje dane wyjściowe polecenia w zmiennej, przetwarza dane wyjściowe, a następnie wyświetla wyniki. Oto co mam:Treść skryptu powłoki zawierająca dane wyjściowe polecenia usuwa znaki nowego wiersza.

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

Problem polega na tym, wyjście otrzymuję od wykonywania skryptu jest następująca:

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

Zważywszy Spodziewałem się następująco:

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

IT wygląda na to, że znaki nowego wiersza są jakoś usunięte. Jak mam je przekazać?

Odpowiedz

17

Jeśli chcesz zachować newlines, należy ująć zmiennej w cudzysłowach:

echo "$stuff" 

Pisząc go bez podwójnych cudzysłowów, powłoka rozszerza $stuff w rozdzieloną spacjami listą słów (gdzie ' słowa "są ciągami znaków spoza przestrzeni, a znaki spacji są puste, tabulatory i znaki nowej linii, a po eksperymentowaniu wydaje się, że kanały formularzy, powroty karetki i przestrzenie tylne nie są liczone jako spacje).


Demonstracja interpretacji znaków kontrolnych jako białych znaków. ASCII 8 to backspace, 9 to tabulacja, 10 to nowa linia (LF), 11 to pionowa zakładka, 12 to forma, 13 to powrót karetki. Pierwsze polecenie generuje sekwencję znaków oddzielonych różnymi znakami kontrolnymi. Drugie polecenie wyświetla wynik z zachowaniem oryginalnych znaków - patrz zrzut heksadecymalny. Trzecie polecenie odtwarza wynik, gdy powłoka dzieli słowa; widać, że zakładkę i znak nowej linii zastąpiono pustym (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 ma rację. Powodem jest to, że powłoka w przeciwnym razie usunie dla Ciebie białe spacje. –

Powiązane problemy