Эхо-символы в bash script

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

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

Я получаю это

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

Ответ 1

echo -e ' \t '

будет эхом "space tab space newline" (-e означает "разрешить интерпретацию обратных слэшей" ):

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

Ответ 2

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

Ответ 3

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

echo "[$res]"

Ответ 4

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

echo Hello$'\t'world.

Ответ 6

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

echo -e "\t\t x"

Ответ 7

На странице bash man:

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

Итак, вы можете сделать это:

echo $'hello\tworld'

Ответ 8

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

# sh -e myscript.sh

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

# chmod +x myscript.sh
# ./myscript.sh

Ответ 9

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

Ответ 10

res="\t\tx"
echo -e "[${res}]"