Відповіді:
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символи.
Використання ехо для друку значень змінних - це звичайна помилка Баша. Посилання: