Посмотрите, что разные слои делают по отдельности:
$ 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
вместо