Ответы:
echo -e ' \t '
отобразит «пробел в новой строке» ( -e
означает «включить интерпретацию обратной косой черты»):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
не работает с Makefiles?
echo -e
это не POSIX, а make
вызовы, /bin/sh
которые обычно не используются программой, используют в интерактивном режиме и обычно не -e
реализуются. Для мобильности используйте printf '\t'
вместо этого.
man
странице echo
команды не упоминается опция -e
. Однако этот вариант принят.
Используйте 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
реализацией или другой оболочкой.
Вы также можете попробовать:
echo Hello$'\t'world.
Со страницы руководства bash:
Слова вида $ 'string' обрабатываются специально. Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C.
Так что вы можете сделать это:
echo $'hello\tworld'
Используйте дословное нажатие клавиши, ^V
( CTRL+V
, C-v
, независимо ).
Когда вы печатаете ^V
в терминале (или в большинстве редакторов Unix), следующий символ принимается дословно . Вы можете использовать это для ввода буквального символа табуляции в строке, которую вы выводите.
Что-то вроде следующих работ:
echo "^V<tab>" # CTRL+V, TAB
Документы Bash ( см. "Цитируемое")
quoted-insert (Cq, Cv) Добавьте следующий набранный вами символ в строку. Это как вставить последовательности клавиш, например, Cq.
примечание стороны: согласно этому, ALT+TAB
должны делать то же самое, но мы все привязали эту последовательность к переключению окна, поэтому мы не можем ее использовать
tab-insert (M-TAB) Вставить символ табуляции.
-
Примечание: вы можете использовать эту стратегию со всеми видами необычных персонажей. Как возврат каретки:
echo "^V^M" # CTRL+V, CTRL+M
Это потому, что возврат каретки равен ASCII 13, а M - 13-я буква алфавита, поэтому при вводе ^M
вы получаете 13-й символ ASCII. Вы можете увидеть его в действии, используя ls^M
пустую подсказку, которая вставит возврат каретки, заставляя подсказку действовать так же, как вы нажали return. Когда эти символы обычно интерпретируются, дословно получается, что вы получаете буквальный символ.
grep
для ловли строки, содержащие tab
символы.
Использование echo для вывода значений переменных является распространенной ошибкой Bash. Ссылка ссылка: