Как отобразить один или несколько символов табуляции с помощью скрипта bash? Когда я запускаю этот код
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
Я понял
res=[ x] # that is [<space>x]
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
чтобы сохранить выходные данные в переменной).Для вашего примера:
И теперь пришло время признать, что
echo
это сработает так же, как пример, о котором вы спрашиваете; вам просто нужно поставить двойные кавычки вокруг аргумента:как писал kmkaplan (два с половиной года назад я только заметил!). Проблема с вашими оригинальными командами:
не с
echo
; дело в том, что оболочка заменила вкладку пробелом, прежде чем ееecho
увидели.echo
хорошо для простого вывода,echo hello world
но вы должны использоватьprintf
всякий раз, когда вы хотите сделать что-то более сложное. Вы можете приступитьecho
к работе, но результирующий код, скорее всего, потерпит неудачу, когда вы запустите его с другойecho
реализацией или другой оболочкой.источник
Поместите вашу строку между двойными кавычками:
источник
Вы также можете попробовать:
источник
вам нужно использовать флаг -e для эха, тогда вы можете
источник
Со страницы руководства bash:
Так что вы можете сделать это:
источник
Используйте дословное нажатие клавиши,
^V
(CTRL+V
,C-v
, независимо ).Когда вы печатаете
^V
в терминале (или в большинстве редакторов Unix), следующий символ принимается дословно . Вы можете использовать это для ввода буквального символа табуляции в строке, которую вы выводите.Что-то вроде следующих работ:
Документы Bash ( см. "Цитируемое")
примечание стороны: согласно этому,
ALT+TAB
должны делать то же самое, но мы все привязали эту последовательность к переключению окна, поэтому мы не можем ее использовать-
Примечание: вы можете использовать эту стратегию со всеми видами необычных персонажей. Как возврат каретки:
Это потому, что возврат каретки равен ASCII 13, а M - 13-я буква алфавита, поэтому при вводе
^M
вы получаете 13-й символ ASCII. Вы можете увидеть его в действии, используяls^M
пустую подсказку, которая вставит возврат каретки, заставляя подсказку действовать так же, как вы нажали return. Когда эти символы обычно интерпретируются, дословно получается, что вы получаете буквальный символ.источник
grep
для ловли строки, содержащиеtab
символы.Использование echo для вывода значений переменных является распространенной ошибкой Bash. Ссылка ссылка:
http://mywiki.wooledge.org/BashPitfalls#echo_.24foo
источник
Если вы хотите использовать
echo "a\tb"
в скрипте, вы запускаете скрипт как:В качестве альтернативы вы можете дать myscript.sh разрешение на выполнение, а затем запустить скрипт.
источник
источник