Стивен уже объяснил, почему так много обратной косой черты необходимо; Я хотел бы перечислить некоторые, возможно, лучшие способы сделать то же самое. Во-первых, использование одинарных кавычек вместо двойных кавычек пропускает дополнительный уровень интерпретации / удаления escape:
$ echo -e "Test\\\nNewline"
Test\nNewline
$ echo -e 'Test\\\nNewline'
Test\
Newline
Во-вторых, я не рекомендую использовать echo
для подобных вещей, поскольку разные его версии ведут себя совершенно по-разному: некоторые интерпретируют escape-последовательности в строке (например, \n
) даже без опции -e
, некоторые выводят «-e» как часть их вывода и т. д. Вот пример использования /bin /echo вместо встроенной версии bash:
$ /bin/echo -e 'Test\\\nNewline'
-e Test\\\nNewline
...Это на OS X v10.10.4; это может отличаться в вашей ОС и / или версии. В любое время, когда вам нужно предсказуемое поведение с escape-интерпретацией и / или без финального перевода строки, я рекомендую printf
вместо echo
. Это немного сложнее: первый аргумент для printf
- это строка формата, в которой экранирование всегда интерпретируется, и это также может включать %
последовательностей, которые будут использоваться для добавления в оставшиеся аргументы (в которых экранированные последовательности не интерпретируются), Кроме того, printf
автоматически не добавляет перевод строки в конце, вы должны включить это явно. Вот несколько способов напечатать то, что вы хотите с помощью printf
:
$ printf 'Test\\\nNewline\n' # note explicit final newline
Test\
Newline
$ printf '%s\n' 'Test\' 'Newline' # Escape is interpreted in the format string, but not in the second argument
Test\
Newline