2013-06-03 11 views
11

Znak Escape (\) może być użyty do ucieczki z końca linii, np.Koniec linii (nowa linia) ucieka w bashu

% echo This could be \ 
a very \ 
long line\! 
This could be a very long line! 
% 

nie jest jednak końca linii (nowa wersja) reprezentowanego przez \n który ma dwa znaki. nie powinno być rezultatem ucieczki, aby być literalną z \n. na przykład

%echo $'\\n' 
\n 
% 

Dziękuję za odpowiedź!

Edytuj: Niestety, nie wyjaśniłem tego wystarczająco dobrze. Nie próbuję powtórzyć nowej linii. Zastanawiam się, dlaczego \ jest w stanie wprowadzić znak nowej linii (\n), który ma dwa znaki zamiast po prostu uciekać od ukośnika odwrotnego w nowym wierszu i wygenerować literał \ n

+0

http://www.gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting –

+8

Hmm, wciąż nie jestem pewien, czy rozumiem twoje pytanie. Być może pomoże to w zrozumieniu, że '\ n' nie jest _nowy_ znakiem nowej linii - jest to sekwencja escape, która _reprezentuje_linię (która jest tylko jedną z postaci w Linuksie). '\' Na końcu linii ucieka znak _actual_ newline, który wpisujesz używając klawisza 'enter'. –

+0

@ MarkkuK, dziękuję! to właściwie odpowiada na moje pytanie. Zawsze myślałem, że '\ n' jest nową postacią linii. Dlatego nie rozumiem, dlaczego ukośnik odwrotny może uciec dwóm osobom. Przepraszam za złe frazowanie. – Yoland

Odpowiedz

16

Właściwie \n nie naprawdę jest znak nowej linii - jest to sekwencja ucieczki że reprezentuje nowej linii (który jest tylko jeden znak w Linuksie). Numer \ na końcu linii ucieka przed nowym znakiem nowej linii , który wpisujesz za pomocą klawisza Enter. Można spojrzeć na to, co ASCII wartości reprezentują różne znaki za pomocą hexdump:

%echo $'\\n' 
\n 
%echo $'\\n' | hexdump -C 
00000000 5c 6e 0a     |\n.| 
00000003 

Można zauważyć, że echo wydrukowany 3 znaki: \ (5c), n (6e) i znak nowej linii (0A). Zauważysz również, że po prawej stronie wyjścia heksowego, znak nowej linii pojawia się jako ".", Ponieważ jest uważany za non-printing character.

1

Newline to nazwa podana w świecie UNIX znak, który kończy linię w pliku zorientowanym na linię (lub w terminalu). W świecie UNIX/Linux odpowiada to znakowi liniowemu ASCII.

Różne systemy używają różnych konwencji dla linii końcowych: system Windows używa sekwencji powrotu karetki i linii, podczas gdy Mac początkowo używał powrotu karetki. To zamieszanie wynika z faktu, że pierwotnie były to polecenia potrzebne do przeniesienia głowicy drukującej drukarki na początek nowej linii.

\n to konwencjonalny sposób wyrażania znaku końca linii w kodzie, ponownie oryginalnie w świecie UNIX, a dokładniej w języku C. Zauważ, że podczas odczytu pliku tekstowego C odczytuje pojedynczy znak nowego wiersza, nawet w systemach, w których jest to naprawdę sekwencja dwuznakowa.

+0

W systemie UNIX, jeśli znak nowej linii składa się z 2 znaków, C (lub bardziej precyzyjnie odczytany) odczytuje 2 znaki. W systemie Windows, jeśli plik zostanie otwarty jako plik tekstowy, biblioteka przekonwertuje sekwencję \ r \ n na \ n. W przeciwnym razie nawet na Windowsie 2 będą czytane znaki. – martinkunev

+0

W systemie UNIX znak nowej linii składa się z jednej litery i jest to linia ASCII lub jej odpowiednik w innych zestawach znaków. To prawda, że ​​sekwencje powrotu do linii i powrotu karetki są odczytywane bez zmian. –