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

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

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

Я понял

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

10 ответов

Решение
echo -e ' \t '

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

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

Использование 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.

Поместите вашу строку между двойными кавычками:

echo "[$res]"

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

echo -e "\t\t x"

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

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

http://mywiki.wooledge.org/BashPitfalls

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

# sh -e myscript.sh

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

# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"
Другие вопросы по тегам