В терминале Ubuntu 18.04 LTS, когда я пишу эту команду:
echo -e "Hello\\\n"
Это дает в качестве вывода:
Hello\n
Но это должно напечатать, как man page говорит:
Hello\
То есть сначала выведите Hello
, затем \
, затем символ новой строки (а затем еще один символ новой строки). В чем проблема?
См. Эти несколько echo -e
команд и их вывод :
man420@man420-X542UQ:~$ echo -e "HEllo\a\a\a\a\a\a\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\a\\\n"
HEllo\n
Обратными косыми чертами рассматривают особенно echo -e
, но сначала их иногда рассматривает особенно оболочка (который в этом случае является bash
), согласно правилам заключения в кавычки оболочки.
Аргумент echo
на самом деле видит, Hello\\n
. Поскольку Вы передали -e
кому: echo
, это рассматривает Escape обратной косой черты особенно, и \\
сворачивается к синглу \
. Финал n
не оставлен, таким образом, это появляется буквально.
Причина этого состоит в том что, до и отдельно от операции echo
самостоятельно, обработки оболочки \
особенно в некоторых контекстах, но не других. Неупомянутый \
символы всегда рассматривают особенно, единственно заключают в кавычки \
никогда не рассматриваются особенно, но обработка дважды заключенных в кавычки \
символы, как в команде, которую Вы выполнили, являются более тонкими и сложными.
Когда оболочка встречается с дважды заключенным в кавычки текстом в команде, как с "Hello\\\n"
, это рассматривает \
как символ ESC, когда это предшествует символу, который может самостоятельно иметь особое значение в двойных кавычках и не иначе.
\
иногда имеет особое значение внутри ""
, 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
.