Это потому что bash
и в echo -e
сочетании. Отman 1 bash
Обратный слэш (
\
) без кавычек является escape-символом. Он сохраняет буквальное значение следующего символа, за исключением<newline>
. [...]Ограждающие символы в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением
$
`,\
[...] обратная косая черта сохраняет свой особый смысл только тогда, когда следует один из следующих символов:$
`,"
,\
, или<newline>
.
Дело в том, что обратный слэш с двойными кавычками не всегда особенный.
Существуют различные реализации echo
в целом, это встроенный bash
; главное здесь это поведение:
Если
-e
действует, распознаются следующие последовательности:
\\
обратная косая черта
[…]
\n
новая строка
Теперь мы можем расшифровать:
echo -e "\ Hello!"
- ничего особенногоbash
, ничего особенногоecho
;\
остается.echo -e "\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально;echo
получает\ Hello!
и действует как выше.echo -e "\\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально;echo
получает\\ Hello!
и (из-за-e
) это признает\\
как\
.echo -e "\\\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально; третий говорит то же самое о четвертом;echo
получает\\ Hello!
и (из-за-e
) это признает\\
как\
.echo -e "\\\\\ Hello!"
- первое\
говорит,bash
чтобы относиться ко второму\
буквально; третий говорит то же самое о четвертом; последний не особенный;echo
получает\\\ Hello!
и (из-за-e
) распознает начальный\\
как\
, последний\
остается неизменным.
И так далее. Как видите, до четырех последовательных обратных слешей дают один результат. Вот почему вам нужно (по крайней мере) девять из них, чтобы получить три. 9 = 4 + 4 + 1.
Теперь с \n
:
echo -e "\n Hello!"
- в этом нет ничего особенногоbash
, echo получает ту же строку и (из-за-e
) интерпретирует ее\n
как перевод строки.echo -e "\\n Hello!"
-bash
интерпретирует\\
как\
;echo
получает\n Hello!
и результат такой же, как указано выше.echo -e "\\\n Hello!"
-bash
интерпретирует начальное\\
как\
;echo
получает\\n Hello!
и (из-за-e
) это интерпретирует\\
как литерал,\
который должен быть напечатан.
Результаты будут отличаться '
вместо "
(из-за разного bash
поведения) или без -e
(из-за разного echo
поведения).