Обратные слеши обрабатываются особым образом echo -e
, но сначала они иногда обрабатываются особым образом оболочкой (что в данном случае bash
) в соответствии с правилами цитирования оболочки .
Аргумент на echo
самом деле видит это Hello\\n
. Поскольку вы перешли -e
на echo
, он обрабатывает обратные слэши специально и \\
сводится к одному \
. Финал n
не избежал, поэтому выглядит буквально.
Причина этого заключается в том, что до и отдельно от самой операции echo
оболочка обрабатывает \
специально в некоторых контекстах, но не в других. Символы без кавычек \
всегда обрабатываются особым образом, одинарные кавычки \
никогда не обрабатываются особым образом, но обработка символов в двойных кавычках \
, как и в выполняемой вами команде, является более тонкой и сложной.
Когда оболочка встречает в команде текст, заключенный в двойные кавычки, например "Hello\\\n"
, она обрабатывается \
как escape-символ, когда она предшествует символу, который сам может иметь специальное значение внутри двойных кавычек, а не иначе .
- Поскольку
\
иногда имеет особое значение внутри ""
, a, \
который непосредственно предшествует другому, \
имеет эффект цитирования этой секунды \
. Таким образом, внутри двойных кавычек, первые \\
свернуты в \
.
- После этих первых двух
\
символов есть третий \
символ, который не затрагивается этими первыми двумя и который предшествует n
. Но n
это не персонаж, который когда-либо рассматривался специально в двойных кавычках, поэтому \
прежде он не обрабатывается специально в этой ситуации. Таким образом, \n
остается \n
.
Эффект в том, что в двойных кавычках \\\n
интерпретируется как \\n
.
Когда echo -e
видит \\n
, первое \
удаляет особое значение из второго, поэтому echo
печатает \n
буквально для этого текста.
Если ваша цель - печатать Hello
с дополнительной новой строкой, но без обратной косой черты (изначально вопрос был неоднозначным по этому поводу, плюс я думаю, что это полезный пример), тогда одним из решений является удаление a \
. Запуск echo -e "Hello\\n"
выходов Hello
с дополнительным переводом строки в конце.
Лучшее решение - использовать одинарные кавычки и писать echo -e 'Hello\n'
. Одиночные кавычки - самая сильная форма цитирования. Как правило, printf
вместо этого лучше использовать решение echo
, которое в этом случае будет printf 'Hello\n\n'
.
Если ваша цель состоит в Hello\
том, чтобы напечатать в том числе обратную косую черту с последующим дополнительным переводом строки , тогда подход с двойными кавычками возможен, но громоздок. Чтобы понять это, работайте задом наперед: echo -e
преобразует \\
в \
и \n
в новую строку, а двойные кавычки преобразует \\
в \
, так что вы можете сделать это с шестью обратными косыми чертами ( echo -e "Hello\\\\\\n"
), потому что они \\n
превращаются в \n
одну, выходящую из другой обратной косой черты. Вы также можете сделать это с пятью, потому что двойные кавычки сохраняются, \n
когда \
не экранированы.
Это иллюстрирует преимущество echo -e
одинарных кавычек : просто поместите все, что вы хотите видеть внутри одинарных кавычек ( echo -e 'Hello\\\n'
). printf
здесь тоже хорошо Один вариант есть printf 'Hello\\\n\n'
. Но где printf
действительно светит то, что вы можете включить дополнительные аргументы. Вы можете использовать printf '%s\n\n' 'Hello\'
, который вставляет второй аргумент (буквально, Hello\
потому что одинарные кавычки ничего не меняют) вместо %s
.