echo
echoРеалізація яких строго відповідає специфікації Single Unix буде додати нові рядки , якщо ви:
echo 'line1\nline2'
Але це не є надійною поведінкою. Насправді, насправді немає жодної стандартної поведінки, якої можна очікувати echo.
ОПЕРАНДИ
string
Рядок, який слід записати на стандартний вихід. Якщо перший операнд є -n, або якщо будь-який з операндів містить символ < \зворотний косий рядок> , результати визначаються реалізацією .
У системах, сумісних з XSI , якщо перший операнд є -n, він повинен розглядатися як рядок, а не як варіант . Наступні послідовності символів повинні бути розпізнані в системах, що відповідають XSI, в межах будь-якого з аргументів:
\a- Напишіть <alert> .
\b- Напишіть <backspace> .
\c- Пригнічіть <newline>, що в іншому випадку слідує за заключним аргументом у висновку. Усі символи, наведені \cв аргументах, ігноруються.
\f- Напишіть <form-feed> .
\n- Напишіть <newline> .
\r- Напишіть <carriage-return> .
\t- Напишіть <tab> .
\v- Напишіть <vertical-tab> .
\\- Введіть символ <зворотний проріз> .
\0num- Напишіть 8-бітове значення, яке дорівнює нулю, одному, дво- чи тризначному восьмеричному номеру num.
І тому насправді не існує жодного загального способу знати, як написати новий рядок echo, за винятком того, що ви, як правило, можете покластися лише на те, echoщоб зробити це.
bashОболонка зазвичай зовсім НЕ відповідає специфікації, а також обробляє -nі інші варіанти, але навіть це є невизначеним. Ви можете зробити:
shopt -s xpg_echo
echo hey\\nthere
hey
there
І навіть це не потрібно, якщо bashвін був побудований з можливістю збору часу ...
--enable-xpg-echo-default
Зробіть echoзаздалегідь вбудовані символи розширення символів, що уникнули косої риски, не вимагаючи цього -eпараметра. Це встановлює значення за замовчуванням для параметра xpg_echoоболонки на on, що змушує Bash echoповодитись більше, як версія, визначена в специфікації Single Unix, версія 3. Дивіться Bash Builtins , щоб отримати опис послідовностей епізоду , що echoрозпізнається.
printf
З іншого боку, printfповедінка досить приборкано порівняно.
RATIONALE
printfУтиліта була додана , щоб забезпечити функціональні можливості, які історично наданим echo. Однак через непримиренні відмінності в різних версіях echoіснуючих версій є мало особливих особливостей, що залишає їх новій printfутиліті, яка базується на одній у системі Дев'ятого видання.
Розділ ДОСЛІДЖЕНОГО ОПИСУ майже точно відповідає printf()функції в стандарті ISO C, хоча він описаний термінами позначення формату файлу у форматі XBD File Notation .
Він обробляє рядки формату, які описують його аргументи - що може бути будь-якою кількістю речей, але для рядків - це майже будь- %bякі рядки yte або буквальні %sтренги. Окрім %fорматів у першому аргументі, він поводиться найбільше як %bаргумент yte string, за винятком того, що він не обробляє вхід \c.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Дивіться, чому printfкраще, ніж echo? для більш.
echo() printf
Ви можете написати свої власні стандарти, echoяк ...
echo(){
printf '%b ' "$@\n\c"
}
... що завжди повинно робити правильно все автоматично.
Насправді, ні ... Це виводить буквальне \nв кінці аргументів, якщо останній аргумент закінчується непарною кількістю <зворотних косих> .
Але це не так:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echoобов'язковим? ви можете використовуватиprintf.