Відповіді:
echo -e ' \t '
відлунюватиме «пробіл у вкладці пробілу» ( -e
означає «включити інтерпретацію ухилів зворотної косої риски»):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
це не працює з Makefiles?
echo -e
, що не POSIX та make
виклики, /bin/sh
які зазвичай не використовуються програмою, використовуються інтерактивно, і зазвичай не -e
реалізуються. Для мобільності використовуйте printf '\t'
замість цього.
man
сторінка для echo
команди не згадує варіант -e
. Однак цей варіант прийнятий.
Використовуйте 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.
З сторінки "bash man":
Слова форми $ 'string "обробляються спеціально. Слово розширюється до рядка, а символи, що ухиляються від косої риски, замінюються відповідно до стандарту ANSI C.
Тож ви можете це зробити:
echo $'hello\tworld'
Використовуйте дослівне натискання клавіші, ^V
( CTRL+V
, C-v
, незалежно ).
Коли ви набираєте ^V
термінал (або в більшості редакторів Unix), наступний символ приймається дослівно . Ви можете скористатися цим способом для введення буквального символу вкладки усередині рядка, який перегукується.
Щось на зразок наступних робіт:
echo "^V<tab>" # CTRL+V, TAB
Документи Bash ( qv , "котирування-вставка")
quote-insert (Cq, Cv) Додайте наступний символ, який ви вводите до рядка. Наприклад, як вставити ключові послідовності, наприклад, Cq.
бічна примітка: відповідно до цього, ALT+TAB
слід робити те саме, але ми всі зв'язали цю послідовність з перемиканням вікон, щоб ми не могли її використовувати
вставка табуляції (M-TAB) Вставте символ вкладки.
-
Примітка. Ви можете використовувати цю стратегію з усілякими незвичайними персонажами. Як і повернення вагона:
echo "^V^M" # CTRL+V, CTRL+M
Це тому, що повернення вагона - ASCII 13, а M - 13-та літера алфавіту, тож при введенні ^M
ви отримуєте 13-й символ ASCII. Ви можете бачити це в дії, використовуючи ls^M
порожній запит, який вставить повернення вагона, викликаючи запит діяти так само, як ви натискаєте повернення. Коли ці символи звичайно інтерпретуються, дослівно ви отримуєте буквальний символ.
grep
для лову рядків, що містять tab
символи.
Використання ехо для друку значень змінних - це звичайна помилка Баша. Посилання: