Как эхо один или несколько символов табуляции с помощью bash script? Когда я запускаю этот код
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
Я получаю это
res=[ x] # that is [<space>x]
Как эхо один или несколько символов табуляции с помощью bash script? Когда я запускаю этот код
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
Я получаю это
res=[ x] # that is [<space>x]
echo -e ' \t '
будет эхом "space tab space newline" (-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 не), но различные версии гораздо более похожи друг на друга, чем разные версии of 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]"
Вы также можете попробовать:
echo Hello$'\t'world.
Использование эха для печати значений переменных является общим ловушкой Bash. Ссылка ссылки:
вам нужно использовать флаг -e для эха, тогда вы можете
echo -e "\t\t x"
На странице bash man:
Слова формы $'string' обрабатываются специально. Слово расширяется до строки с заменой символов с обратным слэшем, как это определено стандартом ANSI C.
Итак, вы можете сделать это:
echo $'hello\tworld'
Если вы хотите использовать echo "a\tb"
в script, вы запустите script как:
# sh -e myscript.sh
В качестве альтернативы вы можете предоставить myscript.sh разрешение на выполнение, а затем запустить script.
# chmod +x myscript.sh
# ./myscript.sh
Используйте дословное нажатие клавиши ^V
(CTRL+V
, C-v
, что угодно).
Когда вы вводите ^V
в терминал (или в большинстве редакторов Unix), следующий символ берется дословно. Вы можете использовать это, чтобы набирать буквенный символ табуляции внутри строки, в которой вы эхом.
Что-то вроде следующих работ:
echo "^V<tab>" # CTRL+V, TAB
Bash docs (q.v., "quoted-insert" )
quoted-insert (C-q, C-v) Добавьте следующий символ, который вы вводите в строку дословно. Например, как вставить ключевые последовательности, такие как C-q.
сторона примечания: согласно этому, ALT+TAB
должен делать то же самое, но мы все связали эту последовательность с переключением окон, поэтому мы не можем ее использовать
вкладка-вкладка (M-TAB) Вставьте символ табуляции.
-
Примечание. Вы можете использовать эту стратегию со всеми видами необычных символов. Как возврат каретки:
echo "^V^M" # CTRL+V, CTRL+M
Это потому, что возврат каретки - это ASCII 13, а М - 13-я буква алфавита, поэтому при вводе ^M
вы получаете 13-й символ ASCII. Вы можете увидеть его в действии с помощью ls^M
в пустой строке, в которую будет вставлен возврат каретки, в результате чего запрос будет действовать так же, как вы нажмете return. Когда эти символы обычно интерпретируются, дословно получаем, что вы получаете буквальный символ.
res="\t\tx"
echo -e "[${res}]"