почему echo `echo -e" abc \ nab c "` дает мне "ab c ab c"? - PullRequest
0 голосов
/ 06 марта 2020

Вопрос о linux -оболочке.

Когда я набираю

echo `echo -e "abc\nabc"`,

Я получил abc abc не abc\nabc

1 Ответ

2 голосов
/ 06 марта 2020

Посмотрите, что разные слои делают по отдельности:

$ echo -e "abc\nabc"
abc
abc

, потому что echo -e расширяет экранирование sh, например \n. (По крайней мере, тот, который вы использовали; поведение не одинаково для всех оболочек.)

Затем вы echo выводите без кавычек; это заменяет любую последовательность пробелов (включая разрывы строк) по одному пустому символу каждый («разбиение слов»).

$ str="abc
abc"
$ echo $str
abc abc

Если вы заключите строку в кавычки, пробел сохранится (и специальные символы оболочки не действуют) :

$ echo "$str"
abc
abc

Вы можете добиться того же, заключив в кавычки подстановку команд:

$ echo "`echo -e \"abc\nabc\"`"
abc
abc

Однако вы должны избегать внутренних двойных кавычек. Это одна из причин, по которой вместо обратных кавычек в наши дни рекомендуется использовать $(...) для подстановки команд:

$ echo "$(echo -e "abc\nabc")"
abc
abc

И если это не просто пример обучения, помните, что echo "$(cmd)" обычно является антипаттерном и должен быть заменен просто cmd.


Список литературы

  • Этот - отличный обзор того, как echo ( и printf) ведет себя в различных оболочках
  • POSIX spe c для echo с рекомендацией скорее использовать printf вместо
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...