Odwrotne ukośniki są traktowane specjalnie przez echo -e
, ale najpierw są one traktowane specjalnie przez powłokę (która w tym przypadku jest bash
), zgodnie z regułami cytowania powłoki .
Argument echo
faktycznie widzi to Hello\\n
. Ponieważ minęło -e
się echo
, traktuje Odwrotny ukośnik cytuje specjalnie, i \\
jest zwinięta do pojedynczej \
. Finał n
nie jest ucieczkowy, więc wydaje się dosłownie.
Powodem tego jest to, że przed i niezależnie od samego działania echo
, powłoka traktuje \
specjalnie w niektórych kontekstach, ale nie w innych. Nienotowane \
znaki są zawsze traktowane specjalnie, jedno-cytowany \
nigdy nie są traktowane specjalnie, ale leczenie podwójnie cytowany \
znaków, jak w poleceniu uruchomiono, jest bardziej subtelne i skomplikowane.
Gdy powłoka napotyka tekst w cudzysłowie, podobnie jak w przypadku polecenia, "Hello\\\n"
traktuje go \
jako znak zmiany znaczenia, gdy poprzedza znak, który może mieć specjalne znaczenie w cudzysłowach, a nie inaczej .
- Ponieważ
\
czasami ma w środku specjalne znaczenie ""
, to, \
co bezpośrednio poprzedza inne \
, powoduje zacytowanie tej sekundy \
. Wewnątrz podwójnych cudzysłowów pierwsze \\
są zwinięte \
.
- Po tych dwóch pierwszych
\
znakach pojawia się trzeci \
znak, na który nie wpływają pierwsze dwa znaki i który poprzedza znak an n
. Ale n
nie jest postacią, która jest traktowana specjalnie wewnątrz podwójnych cudzysłowów, więc \
wcześniej nie jest traktowana specjalnie w tej sytuacji. Tak \n
zostaje \n
.
Skutkuje to tym, że w podwójnych cudzysłowach \\\n
jest interpretowany jako \\n
.
Kiedy echo -e
widzi \\n
, pierwszy \
usuwa specjalne znaczenie z drugiego, więc echo
drukuje \n
dosłownie dla tego tekstu.
Jeśli Twoim celem jest wydrukowanie Hello
z nowym znakiem nowej linii, ale bez ukośników odwrotnych (pytanie było pierwotnie dwuznaczne, a myślę, że jest to przydatny przykład), wówczas jednym z rozwiązań jest usunięcie znaku\
. Uruchamianie echo -e "Hello\\n"
wyników Hello
z dodatkową nową linią na końcu.
Lepszym rozwiązaniem jest stosowanie pojedynczych cudzysłowów i pisanie echo -e 'Hello\n'
. Pojedyncze cytaty to najsilniejsza forma cytowania. Jeszcze lepszym rozwiązaniem jest użycie printf
zamiast tego echo
, co w tym przypadku byłoby printf 'Hello\n\n'
.
Jeśli Twoim celem jest wydrukowanie z Hello\
uwzględnieniem odwrotnego ukośnika, a następnie dodatkowego nowego wiersza , możliwe jest zastosowanie podwójnego cytowania, ale uciążliwe. Aby to zrozumieć, pracuj wstecz: echo -e
konwertuje \\
na \
i \n
do nowej linii, a podwójne cudzysłowy konwertuje \\
na \
, abyś mógł to zrobić za pomocą sześciu ukośników odwrotnych ( echo -e "Hello\\\\\\n"
), ponieważ \\n
zmienia się w \n
skutek ucieczki jednego ukośnika odwrotnego. Możesz to również zrobić z pięcioma, ponieważ podwójne cytowanie zachowuje się, \n
gdy \
nie jest poprzedzane znakiem ucieczki.
To ilustruje korzyść echo -e
pojedynczego cudzysłowu : po prostu umieść wszystko, co chcesz zobaczyć w pojedynczym cudzysłowie ( echo -e 'Hello\\\n'
). printf
tutaj też jest dobrze. Jedną z opcji jest printf 'Hello\\\n\n'
. Ale printf
naprawdę wyróżnia się to, że możesz podłączyć dodatkowe argumenty. Możesz użyć printf '%s\n\n' 'Hello\'
, który wstawia drugi argument (dosłownie, Hello\
ponieważ pojedyncze cudzysłowy niczego nie zmieniają) zamiast %s
.