Почему команды «echo -e» не дают правильного результата?

В терминале 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
21
задан 1 September 2019 в 22:31

1 ответ

Обратными косыми чертами рассматривают особенно echo -e, но сначала их иногда рассматривает особенно оболочка (который в этом случае является bash), согласно правилам заключения в кавычки оболочки.

Аргумент echo на самом деле видит, Hello\\n. Поскольку Вы передали -e кому: echo, это рассматривает Escape обратной косой черты особенно, и \\ сворачивается к синглу \. Финал n не оставлен, таким образом, это появляется буквально.

Причина этого состоит в том что, до и отдельно от операции echo самостоятельно, обработки оболочки \ особенно в некоторых контекстах, но не других. Неупомянутый \ символы всегда рассматривают особенно, единственно заключают в кавычки \ никогда не рассматриваются особенно, но обработка дважды заключенных в кавычки \ символы, как в команде, которую Вы выполнили, являются более тонкими и сложными.

Когда оболочка встречается с дважды заключенным в кавычки текстом в команде, как с "Hello\\\n", это рассматривает \ как символ ESC, когда это предшествует символу, который может самостоятельно иметь особое значение в двойных кавычках и не иначе.

  1. Поскольку \ иногда имеет особое значение внутри "", a \ это сразу предшествует другому \ имеет эффект заключения в кавычки в ту секунду \. Таким образом в двойных кавычках, первом \\ сворачиваются в \.
  2. После тех первых двух \ символы, существует одна треть \ символ, который незатронут теми первыми двумя и который предшествует 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.

29
ответ дан 23 November 2019 в 01:43

Другие вопросы по тегам:

Похожие вопросы: