Используйте printf
, а не echo
.
Существует несколько разных версий команды echo
. Существует /bin/echo
(которая может быть или не быть версией GNU Coreutils, в зависимости от системы), и команда echo
встроена в большинство оболочек. В разных версиях по-разному (или нет) указывается или отключается экранирование для управляющих символов.
printf
, с другой стороны, имеет гораздо меньше вариаций. Он может существовать в виде команды, обычно /bin/printf
, и он встроен в некоторые оболочки (у bash и zsh есть, tcsh и ksh нет), но различные версии намного больше похожи друг на друга, чем разные версии echo
есть. И вам не нужно запоминать параметры командной строки (за некоторыми исключениями; GNU Coreutils printf принимает --version
и --help
, а встроенный bash printf принимает -v var
для сохранения вывода в переменной).
Для вашего примера:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
И теперь пришло время признать, что echo
будет работать так же хорошо для примера, о котором вы спрашиваете; вам просто нужно поставить двойные кавычки вокруг аргумента:
echo "[$res]"
как писал kmkaplan (два с половиной года назад я только заметил!). Проблема с вашими оригинальными командами:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
не с echo
; дело в том, что оболочка заменила вкладку пробелом до того, как echo
когда-либо ее увидел.
echo
подходит для простого вывода, например echo hello world
, но вы должны использовать printf
всякий раз, когда вы хотите сделать что-то более сложное. Вы можете заставить echo
работать, но результирующий код, скорее всего, потерпит неудачу, если вы запустите его с другой реализацией echo
или другой оболочкой.