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.

Sergey
fuente
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.

algo
fuente
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
choroba
fuente
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'

Vanuan
fuente
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"
Nayeem Zen
fuente
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

Harsha Biyani
fuente
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;
Tio Iroh
fuente
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"
Sathesh
fuente
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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
17

Simplemente escriba

echo

para obtener una nueva línea

Sol R
fuente
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
alinsoar
fuente
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
8

A mí me funciona en CentOS:

echo -e ""hello\nworld""
Vanishedzhou
fuente
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

vinzee
fuente
¿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.

DNT
fuente
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:
TanisDLJ
fuente
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
Avinash Raj
fuente
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)

Dhwanit
fuente
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
PesaThe
fuente
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
skiggety
fuente
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"`
Hunter Frazier
fuente
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\""
John Jai
fuente
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]
Joe Healy
fuente
-1

Solo uso echo sin argumentos

echo "Hello"
echo
echo "World"
Xenón
fuente
-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.

ZenithS
fuente