echo
Una echoimplementación que se ajusta estrictamente a la especificación Single Unix agregará nuevas líneas si lo hace:
echo 'line1\nline2'
Pero ese no es un comportamiento confiable. De hecho, realmente no hay ningún comportamiento estándar que pueda esperar echo.
Operandos
string
Una cadena que se escribirá en la salida estándar. Si el primer operando es -n, o si alguno de los operandos contiene un carácter de < \barra diagonal inversa> , los resultados están definidos por la implementación .
En sistemas conformes a XSI , si el primer operando es -n, se tratará como una cadena, no como una opción . Las siguientes secuencias de caracteres se reconocerán en sistemas conformes a XSI dentro de cualquiera de los argumentos:
\a- Escribe un <alert> .
\b- Escribe un <retroceso> .
\c- Suprima la <línea nueva> que de lo contrario sigue al argumento final en la salida. Todos los caracteres que siguen a los \cen los argumentos serán ignorados.
\f- Escriba un <form-feed> .
\n- Escribir una <nueva línea> .
\r- Escribe un <carriage-return> .
\t- Escribe una <tab> .
\v- Escribe un <vertical-tab> .
\\- Escriba un carácter <backslash> .
\0num- Escriba un valor de 8 bits que sea el número octal de cero, uno, dos o tres dígitos num.
Por lo tanto, no existe una forma general de saber cómo escribir una nueva línea echo, excepto que generalmente puede confiar en hacerlo echo.
Un bashshell normalmente no se ajusta a la especificación y maneja las -ny otras opciones, pero incluso eso es incierto. Tu puedes hacer:
shopt -s xpg_echo
echo hey\\nthere
hey
there
Y ni siquiera eso es necesario si bashse ha construido con la opción de tiempo de construcción ...
--enable-xpg-echo-default
Haga que el echobuiltin expanda caracteres de escape con barra invertida de forma predeterminada, sin requerir la -eopción. Esto establece el valor predeterminado de la xpg_echoopción de shell en on, lo que hace que el Bash se echocomporte más como la versión especificada en la Especificación Single Unix, versión 3. Consulte Bash Builtins , para obtener una descripción de las secuencias de escape que echoreconoce.
printf
Por otro lado, printfel comportamiento es bastante manso en comparación.
RAZÓN FUNDAMENTAL
La printfutilidad se agregó para proporcionar una funcionalidad que históricamente ha sido proporcionada por echo. Sin embargo, debido a las diferencias irreconciliables en las diversas versiones echoexistentes, la versión tiene pocas características especiales, dejando estas a esta nueva printfutilidad, que se basa en una en el sistema de la Novena Edición.
La sección DESCRIPCIÓN EXTENDIDA coincide casi exactamente con la printf()función en el estándar ISO C, aunque se describe en términos de notación de formato de archivo en notación de formato de archivo XBD .
Maneja cadenas de formato que describen sus argumentos, que pueden ser cualquier cantidad de cosas, pero las cadenas son prácticamente %bcadenas de yte o %strings literales . Además de los %formats en el primer argumento, se comporta más como un %bargumento de cadena yte, excepto que no maneja el \cescape.
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
Ver ¿Por qué es printfmejor que echo? para más.
echo() printf
Puede escribir sus propios estándares conformes echocomo ...
echo(){
printf '%b ' "$@\n\c"
}
... que casi siempre debería hacer lo correcto automáticamente.
En realidad, no ... Eso imprime un literal \nen la cola de los argumentos si el último argumento termina en un número impar de <backslashes> .
Pero esto no:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
echoobligatorio? puedes usarprintf.