Nueva línea de eco en Bash imprime literal \ n


2366

En Bash, probé esto:

echo -e "hello\nworld"

Pero no imprime una nueva línea, solo \n. ¿Cómo puedo hacer que imprima la nueva línea?

Estoy usando Ubuntu 11.04.


265
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.


49
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:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world

368
-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
csga5000

578
echo $'hello\nworld'

huellas dactilares

hello
world

$''las cadenas usan Citas ANSI C :

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'


15
@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'`
Kamafeather

141

Siempre se puede hacer echo "".

p.ej

echo "Hello"
echo ""
echo "World"

66
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.
Mario Awad

2
Creo que es menos obvio (y por lo tanto potencialmente más confuso) que echo -en "\n".
DBedrenko

72
echoes suficiente para obtener una línea vacía
ROMANIA_engineer

55
@Okneloper funciona bien para mí.
Matthew leyó el

71

Tratar

echo -e "hello\nworld"
hello
world

Trabajó para mí en nanoeditor.

Desde la página del manual:

-e permitir la interpretación de escapes de barra invertida


41

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/bash
function 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/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

Asegúrese de ajustar la variable con comillas antes de eliminarla del método.
ingyhere

23

Esto funciona para mí en Raspbian,

echo -e "hello\\nworld"

2
También funciona para mí en GitBash en Windows 7 ;-)
Big Rich

3
Una sola barra invertida debería ser suficiente
Felix D.

23

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:

Si el primer operando es -n, o si alguno de los operandos contiene un carácter <backslash>, los resultados están definidos por la implementación.

a menos que tenga una extensión XSI opcional.

Por lo tanto, le recomiendo que use printfen su lugar, que está bien especificado:

el operando de formato se utilizará como la cadena de formato descrita en la notación de formato de archivo XBD [...]

la notación de formato de archivo :

\ n <línea nueva> Mueva la posición de impresión al comienzo de la línea siguiente.

También tenga en cuenta que Ubuntu 15.10 y la mayoría de las distribuciones implementan echotanto como:

  • un Bash incorporado: help echo
  • un ejecutable independiente: which echo

lo que puede generar cierta confusión.


17

Simplemente escriba

echo

para obtener una nueva línea


3
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
Kashyap Kotak


6

También puedes hacer:

echo "hello
world"

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.


4

Mi guión:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

Salida:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

En mi script de bash me estaba enojando como tú hasta que acabo de intentar:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

Simplemente presione enter donde desea insertar ese salto. La salida ahora es:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:

44
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.
dragon788

3

También puedes usar echo con llaves,

$ (echo hello; echo world)
hello
world

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)


echo -ne "hello \ nworld" para la respuesta exacta de la pregunta :)
Dhwanit

3

Se agrega una nueva expansión de parámetrosbash 4.4 que interpreta las secuencias de escape:

${parameter@operator} - E operator

La expansión es una cadena que es el valor del parámetro con secuencias de escape de barra invertida expandidas como con el $'…'mecanismo de comillas.

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world

2

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

0

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:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`

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).

alias helloworld="echo -e \"hello \n world\""

0

Esto me llevó allí ...

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

Rendimientos:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]

-1

Solo uso echo sin argumentos

echo "Hello"
echo
echo "World"

-2

Solución adicional:

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.