Эхо-символы табуляции в скрипте bash - PullRequest
258 голосов
/ 08 февраля 2009

Как отобразить один или несколько символов табуляции с помощью скрипта bash? Когда я запускаю этот код

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

Я понял

res=[ x] # that is [<space>x]

Ответы [ 10 ]

426 голосов
/ 08 февраля 2009
echo -e ' \t '

будет отображать «пробел, пробел, новая строка» (-e означает «включить интерпретацию обратной косой черты»):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|
66 голосов
/ 17 ноября 2011

Используйте 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 или другой оболочкой.

32 голосов
/ 08 февраля 2009

Поместите вашу строку между double цитаты:

echo "[$res]"
26 голосов
/ 11 декабря 2009

Вы также можете попробовать:

echo Hello$'\t'world.
17 голосов
/ 08 февраля 2009

вам нужно использовать флаг -e для эха, тогда вы можете

echo -e "\t\t x"
11 голосов
/ 02 декабря 2015

со страницы руководства bash:

Слова вида $ 'string' обрабатываются специально. Слово расширяется до строки, символы с обратной косой чертой заменяются в соответствии со стандартом ANSI C.

Так что вы можете сделать это:

echo $'hello\tworld'
11 голосов
/ 08 февраля 2009

Использование echo для вывода значений переменных является распространенной ошибкой Bash. Ссылка:

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

8 голосов
/ 06 мая 2016

Используйте дословное нажатие клавиши, ^V (CTRL+V, C-v, независимо от ).

Когда вы набираете ^V в терминале (или в большинстве редакторов Unix), следующий символ принимается дословно . Вы можете использовать это для ввода буквального символа табуляции в строке, которую вы выводите.

Работает примерно так:

echo "^V<tab>"     # CTRL+V, TAB

Документы Bash ( q.v. , "в кавычках")

в кавычках (C-q, C-v) Добавьте следующий введенный символ в строку дословно. Вот как можно вставить последовательности клавиш, например, C-q.

примечание: в соответствии с этим ALT+TAB должно делать то же самое, но мы все привязали эту последовательность к переключению окон, поэтому мы не можем ее использовать

tab-insert (M-TAB) Вставьте символ табуляции.

-

Примечание: вы можете использовать эту стратегию со всеми видами необычных персонажей. Как возврат каретки:

echo "^V^M"        # CTRL+V, CTRL+M

Это потому, что возврат каретки равен ASCII 13, а M - 13-я буква алфавита, поэтому при вводе ^M вы получите 13-й символ ASCII. Вы можете увидеть его в действии, используя ls^M, в пустом приглашении, которое вставит возврат каретки, в результате чего приглашение будет действовать точно так же, как вы нажали return. Когда эти символы обычно интерпретируются, дословно дает вам буквальный символ.

2 голосов
/ 17 ноября 2011

Если вы хотите использовать echo "a\tb" в скрипте, вы запускаете скрипт как:

# sh -e myscript.sh

В качестве альтернативы вы можете дать myscript.sh разрешение на выполнение, а затем запустить скрипт.

# chmod +x myscript.sh
# ./myscript.sh
0 голосов
/ 15 февраля 2016
res="\t\tx"
echo -e "[${res}]"
...