echo
echoРеализация которых строго соответствует спецификации Single Unix будет добавить новые строки , если вы:
echo 'line1\nline2'
Но это не надежное поведение. На самом деле , нет никакого стандартного поведения, от которого вы можете ожидать echo.
ОПЕРАНДЫ
string
Строка для записи в стандартный вывод. Если первый операнд равен -nили если любой из операндов содержит символ < \backslash> , результаты определяются реализацией .
В XSI-совместимых системах, если первый операнд -n, он должен рассматриваться как строка, а не как опция . Следующие последовательности символов должны быть распознаны в XSI-совместимых системах в рамках любого из аргументов:
\a- Напишите <оповещение> .
\b- Напишите <backspace> .
\c- Подавить <newline>, который в противном случае следует за последним аргументом в выводе. Все символы, следующие за \cаргументами, должны игнорироваться.
\f- Напишите <form-feed> .
\n- Напишите <новую строку> .
\r- Напишите <возврат каретки> .
\t- Напишите <вкладку> .
\v- Напишите <вертикальную вкладку> .
\\- Напишите символ обратной косой черты.
\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. Описание встроенных escape-последовательностей см. В Bash Builtinsecho .
printf
С другой стороны, printfповедение по сравнению с этим довольно ручное.
ОБОСНОВАНИЕ
printfУтилита была добавлена , чтобы обеспечить функциональные возможности, которые исторически предоставленным echo. Тем не менее, из-за непримиримых различий в различных существующих версиях echo, эта версия имеет несколько специальных функций, оставляя их для этой новой printfутилиты, которая основана на одной в системе Ninth Edition.
Раздел РАСШИРЕННОГО ОПИСАНИЯ почти точно соответствует printf()функции в стандарте ISO C, хотя он описан в терминах нотации формата файла в нотации формата файла XBD .
Он обрабатывает строки формата, которые описывают его аргументы - это может быть любое количество вещей, но для строк это в значительной степени либо %bстроки yte, либо буквальные %strings. Кроме %fорматов в первом аргументе, он ведет себя как %bстроковый аргумент, за исключением того, что он не обрабатывает \cescape.
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.