it-swarm.com.ru

Эхо-символы табуляции в скрипте bash

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

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

Я понял

res=[ x] # that is [<space>x]
236
kalyanji
echo -e ' \t '

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

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|
395
Johannes Weiss

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

61
Keith Thompson

Поместите строку между double quotes:

echo "[$res]"
31
kmkaplan

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

echo Hello$'\t'world.
25
jbatista

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

echo -e "\t\t x"
17
Learning

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

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

11
Anonymous

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

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

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

echo $'hello\tworld'
11
esoriano

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

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

Что-то вроде следующих работ:

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

Bash docs (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. Когда эти символы обычно интерпретируются, дословно дает вам буквальный символ.

7
rich remer

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

# sh -e myscript.sh

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

# chmod +x myscript.sh
# ./myscript.sh
2
ATC
res="\t\tx"
echo -e "[${res}]"
0
yanghaogn