Ответы:
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. Ссылка ссылка: