Para aquellos que dicen "funciona para mí", el comportamiento del eco varía bastante entre versiones. Algunos incluso imprimirán el "-e" como parte de su salida. Si desea un comportamiento predecible para cualquier cosa no trivial, use printf en su lugar (como en la respuesta de @ sth).
Gordon Davisson
66
No pude hacer funcionar ninguna de las sugerencias en esta respuesta porque, como resultado, estaba intentando usarla en una función que devuelve un valor , y todos los mensajes echo (e printf) en la función se adjuntaron a El valor de retorno después de ser despojado individualmente de las nuevas líneas . Aquí hay una pregunta con respecto a esto, con una respuesta extremadamente exhaustiva: stackoverflow.com/questions/27872069/... Esto fue como un recorrido misterioso de tres horas.
aliteralmind
8
También notable: en Unix & Linux Stack Exchange, la respuesta aceptada a Cómo agregar nuevas líneas cuando se usa echo
Graham Perrin
@GrahamPerrin, gracias por el enlace a una respuesta muy buena y detallada. Creo que es mejor que las respuestas a continuación.
Konstantin
2
echo -ne "hello \ nworld" (necesitabas la bandera n para interpretar escapes), pero como dicen otros, ¡diferentes comandos echo pueden tener resultados diferentes!
Konchog
Respuestas:
2879
Podrías usar printfen su lugar:
printf "hello\nworld\n"
printftiene un comportamiento más consistente que echo. El comportamiento de echovaría mucho entre las diferentes versiones.
o incluso printf %"s\n" hello world- printf reutilizará el formato si se dan demasiados argumentos
glenn jackman
28
El OP preguntó sobre echo, no printf; y la respuesta de @ choroba a continuación, que usa la opción -e, llena la factura perfectamente.
JESii
57
@JESii: Se ajusta si tu echosoporte es compatible con la -eopción.
sth
11
Con algunas versiones de echo, -esolo se imprime en la salida, así que creo que esta respuesta es perfectamente válida ya echoque no es coherente aquí (a menos que estemos hablando de una versión específica).
Tejas Manohar
14
Esto es bueno si printf está disponible, pero a diferencia de echo, a veces printf no está en la distribución.
bigtunacan
1714
¿Estás seguro de que estás en bash? Funciona para mí, las cuatro formas:
-e flag lo hizo por mí, lo que "permite la interpretación de escapes de barra invertida"
tandy
21
Creo que -eparam no existe en todos los sistemas operativos * nix
kenorb
12
@kenorb: existe en bash. Es un incorporado.
choroba
¿Por qué funciona el tercero? Sin los $ devuelve "Hello n world"
Evan Donovan
21
Como se mencionó en varios otros -e NO funciona para todas las distribuciones y versiones. En algunos casos se ignora y en otros se imprimirá. No creo que esto lo solucione para el OP, por lo que no debería aceptarse la respuesta
Las palabras de la forma son tratadas especialmente. La palabra se expande a cadena , con los caracteres con barra invertida reemplazados según lo especificado por el estándar ANSI C.$'string'
@EvgeniSergeev No estoy seguro de lo que quieres decir, pero tampoco funcionó para mí primero. ¡Y eso es porque estaba usando comillas dobles y resulta que esto funciona solo con comillas simples! Intenté en Terminal en Mac.
trss 01 de
11
Problemas con variables en la cadena que no se expanden.
willemdh
Todavía puede concatenar cadenas de comillas dobles. `foo =" bar "; echo $ '' $ foo'efoot'`
En el caso de que alguien se encuentre golpeándose la cabeza contra la pared tratando de descubrir por qué el guión de un compañero de trabajo no imprime nuevas líneas, busque esto ->
#!/bin/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
echo $(GET_RECORDS);
Como en lo anterior, la ejecución real del método puede estar envuelta en un eco que reemplaza cualquier eco que pueda estar en el método. Obviamente diluí esto por brevedad, ¡no fue tan fácil de detectar!
Luego puede informar a sus camaradas que una mejor manera de ejecutar funciones sería así:
#!/bin/bashfunction GET_RECORDS(){
echo -e "starting\n the process";}
GET_RECORDS;
Respuesta muy subestimada, no puedo creer que esta pregunta haya acumulado más de 20 respuestas desde 2011 y que ninguna de ellas contenga esta solución simple.
Prometeo el
alias c = 'eco; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ; eco ;' Esta es la única forma en que puedo limpiar mi pantalla, ¡gracias!
Ahi Tuna
@Ahi Tuna: utiliza los atajos de teclado de tu consola en su lugar :)
Dom dom
@RSun y ¿cómo haría eso en una ventana de terminal de Debian en un Chromebook?
Ahi Tuna
1
@AhiTuna claro; o ctrl + l;
Mike Seeds
16
str='hello\nworld'
$ echo | sed "i$str"
hello
world
Esta es realmente una gran respuesta ya que funciona para concatenaciones de cadenas. ¡Excelente!
LavaScornedOven
1
¿Por qué molestarse en invocar un segundo programa? No es que estemos tratando de escribir una aplicación en tiempo real en bash;) pero no es necesario.
Felix D.
Esta es realmente una gran respuesta que debería funcionar en todas partes sin importar qué. Me salvaste el día amigo @alinsoar
Esto funciona tanto dentro de un script como desde la línea de comandos.
En la línea de comando, presione Shift+ Enterpara hacer los saltos de línea dentro de la cadena.
Esto funciona para mí en mi macOS y mi Ubuntu 18.04
¿Cómo escribe ese salto de línea sin tener el shell para ejecutar el comando cuando presiona Ènter`?
Xenos
@Xenos Esto funciona bien en un script. Y en la consola, simplemente haga clic en Shift + Enter para agregar una nueva línea para evitar que el shell ejecute el comando inacabado.
vinzee
5
Una entrada más aquí para aquellos que no lo hicieron funcionar con ninguna de estas soluciones, y necesitan obtener un valor de retorno de su función:
function foo(){local v="Dimi";local s="";.....
s+="Some message here $v $1\n".....
echo $s
}
r=$(foo "my message");
echo -e $r;
Solo este truco funcionó en un Linux en el que estaba trabajando con este bash:
GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Espero que ayude a alguien con un problema similar.
Solo una nota, probablemente querrá usar $ {} alrededor de los nombres de sus variables, ya que no hacerlo puede conducir a un comportamiento realmente extraño cuando un shell encuentra una variable llamada $ warningsFound e imprime eso y no las dos salidas separadas.
dragon788
@ dragon788 tal vez me falta algo, pero la variable IS en realidad se llama $ warningsFound?
psynnott
2
Me perdí una palabra sobre eso. Si tuviera una variable llamada $ warnings, en algunos casos sin usar $ {warningsFound}, podría terminar con el contenido de $ warnings + "Found" en lugar de la variable que deseaba.
error de sintaxis cerca del token inesperado `('cuando se llama en el archivo .sh
cosbor11
1
probarecho hello; echo world
Avinash Raj
1
O "echo hello && echo world" o simplemente: "echo hello echo world
csga5000
3
Esto podría hacerse mejor como
x="\n"
echo -ne $x
La opción -e interpretará las barras invertidas para la secuencia de escape
-n la opción eliminará la nueva línea final en la salida
PD: el comando echo tiene el efecto de incluir siempre una nueva línea final en la salida, por lo que se requiere n para apagar esa cosa (y hacerla menos confusa)
Si está escribiendo guiones y repetirá nuevas líneas como parte de otros mensajes varias veces, una buena solución multiplataforma es poner una nueva línea literal en una variable como esta:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}">&2#requires usage to be defined
Esto es incorrecto. Nunca se interpreta como \n. Se interpreta como un argumento separado para el programa, y el programa en sí mismo puede mostrar ese argumento en una nueva línea, pero eso no significa que se haya convertido \nen ningún punto y que dependa completamente del programa.
Score_Under
0
Tuve que rodear el texto con comillas dobles mientras lo usaba como un alias en el perfil bash (MacOx, iTerm).
En algunos casos, debe hacer eco de varias líneas de los contenidos largos (como código / configuraciones)
Por ejemplo :
Un script Bash para generar códigos / configuraciones
echo -e,
printfpodría tener alguna limitación
Puede usar algunos caracteres especiales como un marcador de posición como un salto de línea (como ~) y reemplazarlo después de crear el archivo usandotr
echo ${content}| tr '~''\n'> $targetFile
necesita invocar otro programa ( tr) que debería estar bien en mi opinión.
Respuestas:
Podrías usar
printf
en su lugar:printf
tiene un comportamiento más consistente queecho
. El comportamiento deecho
varía mucho entre las diferentes versiones.fuente
printf %"s\n" hello world
- printf reutilizará el formato si se dan demasiados argumentosecho
soporte es compatible con la-e
opción.echo
,-e
solo se imprime en la salida, así que creo que esta respuesta es perfectamente válida yaecho
que no es coherente aquí (a menos que estemos hablando de una versión específica).¿Estás seguro de que estás en bash? Funciona para mí, las cuatro formas:
fuente
-e
param no existe en todos los sistemas operativos * nixhuellas dactilares
$''
las cadenas usan Citas ANSI C :fuente
Siempre se puede hacer
echo ""
.p.ej
fuente
echo ""
funciona para mí y creo que es la forma más simple de imprimir una nueva línea, incluso si esto no responde directamente a la pregunta. Salud.echo -en "\n"
.echo
es suficiente para obtener una línea vacíaTratar
Trabajó para mí en
nano
editor.Desde la página del manual:
fuente
En el caso de que alguien se encuentre golpeándose la cabeza contra la pared tratando de descubrir por qué el guión de un compañero de trabajo no imprime nuevas líneas, busque esto ->
Como en lo anterior, la ejecución real del método puede estar envuelta en un eco que reemplaza cualquier eco que pueda estar en el método. Obviamente diluí esto por brevedad, ¡no fue tan fácil de detectar!
Luego puede informar a sus camaradas que una mejor manera de ejecutar funciones sería así:
fuente
Esto funciona para mí en Raspbian,
fuente
POSIX 7 en eco
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
no está definido y las barras diagonales inversas están definidas en la implementación:a menos que tenga una extensión XSI opcional.
Por lo tanto, le recomiendo que use
printf
en su lugar, que está bien especificado:la notación de formato de archivo :
También tenga en cuenta que Ubuntu 15.10 y la mayoría de las distribuciones implementan
echo
tanto como:help echo
which echo
lo que puede generar cierta confusión.
fuente
Simplemente escriba
para obtener una nueva línea
fuente
fuente
A mí me funciona en CentOS:
fuente
También puedes hacer:
Esto funciona tanto dentro de un script como desde la línea de comandos.
En la línea de comando, presione Shift+ Enterpara hacer los saltos de línea dentro de la cadena.
Esto funciona para mí en mi macOS y mi Ubuntu 18.04
fuente
Una entrada más aquí para aquellos que no lo hicieron funcionar con ninguna de estas soluciones, y necesitan obtener un valor de retorno de su función:
Solo este truco funcionó en un Linux en el que estaba trabajando con este bash:
Espero que ayude a alguien con un problema similar.
fuente
Mi guión:
Salida:
En mi script de bash me estaba enojando como tú hasta que acabo de intentar:
Simplemente presione enter donde desea insertar ese salto. La salida ahora es:
fuente
También puedes usar echo con llaves,
fuente
echo hello; echo world
Esto podría hacerse mejor como
La opción -e interpretará las barras invertidas para la secuencia de escape
-n la opción eliminará la nueva línea final en la salida
PD: el comando echo tiene el efecto de incluir siempre una nueva línea final en la salida, por lo que se requiere n para apagar esa cosa (y hacerla menos confusa)
fuente
Se agrega una nueva expansión de parámetros
bash 4.4
que interpreta las secuencias de escape:fuente
Si está escribiendo guiones y repetirá nuevas líneas como parte de otros mensajes varias veces, una buena solución multiplataforma es poner una nueva línea literal en una variable como esta:
fuente
A veces puede pasar varias cadenas separadas por un espacio y se interpretará como
\n
.Por ejemplo, cuando se usa un script de shell para notificaciones de varias líneas:
fuente
\n
. Se interpreta como un argumento separado para el programa, y el programa en sí mismo puede mostrar ese argumento en una nueva línea, pero eso no significa que se haya convertido\n
en ningún punto y que dependa completamente del programa.Tuve que rodear el texto con comillas dobles mientras lo usaba como un alias en el perfil bash (MacOx, iTerm).
fuente
Esto me llevó allí ...
Rendimientos:
fuente
Solo uso echo sin argumentos
fuente
Solución adicional:
En algunos casos, debe hacer eco de varias líneas de los contenidos largos (como código / configuraciones)
Por ejemplo :
echo -e
,printf
podría tener alguna limitaciónPuede usar algunos caracteres especiales como un marcador de posición como un salto de línea (como
~
) y reemplazarlo después de crear el archivo usandotr
necesita invocar otro programa (
tr
) que debería estar bien en mi opinión.fuente