Эхо-символы табуляции в скрипте 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 "[$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. Ссылка ссылка:
Если вы хотите использовать echo "a\tb"
в скрипте вы запускаете скрипт как:
# sh -e myscript.sh
В качестве альтернативы вы можете дать myscript.sh разрешение на выполнение, а затем запустить скрипт.
# chmod +x myscript.sh
# ./myscript.sh