Является ли echoобязательным? Вы можете использовать printf.
Архемар
Я не знал о printf, с printf она работает: P ... так что же тогда делает не работать с echo?
Саид Яздани
Включено \rв вывод или является частью CRLFновой строки?
cuonglm
9
Существует множество различных реализаций echoкоманд, несовместимых друг с другом. При этом рекомендуется использовать более стандартный инструмент, как printf. См. Unix.stackexchange.com/questions/65803/… для расширенного обзора проблемы.
Строка для записи в стандартный вывод. Если первый операнд равен -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был собран с опцией времени сборки ...
Сделайте так, чтобы 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.
Хорошая простая опция "-e", чтобы заставить работать escape-последовательности - это говорит о другом ответе, который echoненадежен и не соответствует стандартам в отличие printf.
Эдвард
1
Убедитесь, что ваш скрипт не содержит никаких буквальных символов \ r \ n, например, в tr -d "\n"команде.
Нумен
8
Во всех версиях bash, которые я использовал, вы можете просто вставить буквальную новую строку в строку либо в интерактивном режиме, либо в сценарии, при условии, что строка достаточно заключена в кавычки.
echo
обязательным? Вы можете использоватьprintf
.\r
в вывод или является частьюCRLF
новой строки?echo
команд, несовместимых друг с другом. При этом рекомендуется использовать более стандартный инструмент, какprintf
. См. Unix.stackexchange.com/questions/65803/… для расширенного обзора проблемы.Ответы:
echo
echo
Реализация которых строго соответствует спецификации Single Unix будет добавить новые строки , если вы:Но это не надежное поведение. На самом деле , нет никакого стандартного поведения, от которого вы можете ожидать
echo
.И поэтому на самом деле нет никакого общего способа узнать, как написать новую строку
echo
, за исключением того, что вы, как правило, можете полагаться толькоecho
на это.bash
Оболочка обычно вовсе не соответствует спецификации, а также обрабатывает-n
и другие варианты, но даже это является неопределенным. Ты можешь сделать:И даже не это необходимо, если
bash
был собран с опцией времени сборки ...printf
С другой стороны,
printf
поведение по сравнению с этим довольно ручное.Он обрабатывает строки формата, которые описывают его аргументы - это может быть любое количество вещей, но для строк это в значительной степени либо
%b
строки yte, либо буквальные%s
trings. Кроме%f
орматов в первом аргументе, он ведет себя как%b
строковый аргумент, за исключением того, что он не обрабатывает\c
escape.Видишь Почему
printf
лучше чемecho
? для большего.echo() printf
Вы можете написать свои собственные стандарты,
echo
как ...... который всегда должен делать правильные вещи автоматически.
На самом деле, нет ... Это печатает литерал
\n
в хвосте аргументов, если последний аргумент заканчивается нечетным числом <обратных слешей> .Но это не так:
источник
shopt -s xpg_echo
опции вecho
использовать-e
по умолчанию.-e
. Я удивлен, что никто не заметил этого, кроме, возможно, @HaydeSchiffПередайте флаг -e в echo, чтобы он анализировал экранированные символы, такие как «\ r \ n», например:
источник
echo
ненадежен и не соответствует стандартам в отличиеprintf
.tr -d "\n"
команде.Во всех версиях bash, которые я использовал, вы можете просто вставить буквальную новую строку в строку либо в интерактивном режиме, либо в сценарии, при условии, что строка достаточно заключена в кавычки.
Интерактивное:
В скрипте:
источник
дальнейшие возможности использования:
источник
Люди уже ответили адекватно, но я отказываюсь принимать мир, в котором эхо принимает любой вариант, кроме
-n
.источник
Если у вас есть персонаж, который не является частью сообщения, вы можете передать через sed
источник