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, либо буквальные %s
trings. Кроме %f
орматов в первом аргументе, он ведет себя как %b
строковый аргумент, за исключением того, что он не обрабатывает \c
escape.
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
.