'echo' sin nueva línea en un script de shell


541

Tengo un problema con echomi script:

echo -n "Some string..."

huellas dactilares

-n Some string...

y se mueve a la siguiente línea. En la consola funciona correctamente sin nueva línea:

Some string...

2
¿Qué implementación de shell bourne está utilizando? Si ejecuto bashen modo shell bourne, funciona bien aquí. Además, es poco probable que realmente estés usando un shell bourne como tu shell interactivo, ¿no?
FatalError

44
en Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii

Sé que esto es muy antiguo, pero esto funciona para mí en Windows 10, para agregar un punto sin una nueva línea: echo | set / p = "."
Abierto

Respuestas:


574

Existen múltiples versiones del echocomando, con diferentes comportamientos. Aparentemente, el shell utilizado para su script usa una versión que no reconoce -n.

El printfcomando tiene un comportamiento mucho más consistente. echoestá bien para cosas simples como echo hello, pero sugiero usar printfpara algo más complicado.

¿En qué sistema estás y qué shell utiliza tu script?


46
Al comenzar con la línea #!/bin/bashfuncionó. Normalmente estoy trabajando con bash.
qwertz

Desearía que hubiera un equivalente de Windows en CMD :( Hasta donde puedo ver, no lo hay, solo soluciones para lograr el mismo comportamiento.
kayleeFrye_onDeck

2
@kayleeFrye_onDeck: Quizás haya una versión de Windows del printfcomando.
Keith Thompson

Yo deseo. echosiempre agrega nuevas líneas ... La solución es jenky en el mejor de los casos.
kayleeFrye_onDeck

2
@alper The %es su indicador de shell. Prueba esto y observa con atención:printf hello; sleep 5
Keith Thompson,

150

bash tiene un comando "incorporado" llamado "echo":

$ type echo
echo is a shell builtin

Además, hay un comando "echo" que es un ejecutable adecuado (es decir, las bifurcaciones y los ejecutivos de shell /bin/echo, en lugar de interpretarlo echoy ejecutarlo):

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 22856 Jul 21  2011 /bin/echo

El comportamiento de cualquiera echode los WRT \cy -nvaría. Su mejor opción es usar printf, que está disponible en cuatro sabores * NIX diferentes que miré:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"

3
Gracias por la respuesta masiva en profundidad!
Darth Egregious

91

Probar con

echo -e "Some string...\c"

Funciona para mí como se esperaba (como entendí por su pregunta).

Tenga en cuenta que obtuve esta información de la manpágina. La manpágina también señala que el shell puede tener su propia versión echo, y no estoy seguro si bashtiene su propia versión.


+1 por insinuarme en la dirección correcta, aunque el eco que no reconoce la opción -ne probablemente tampoco reconoce la opción -e (ni necesita), por lo que probablemente solo desee decirlo echo "some string...\c". Sin embargo, si necesita admitir múltiples variantes de bash con comandos de eco muy diferentes, probablemente sea mejor que use printf o necesite verificar las capacidades de los comandos de eco con algo como [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(al menos bash admite \ c también, por lo que no es necesario usar el -n opción, pero necesita el -e para bash)
Timo

Para mí, esto hace exactamente lo que hace -n en el caso de OP: genera literal -e. Supongo que printf es de hecho más consistente
aexl

-e no funcionará en un script de shell posix, en su lugar se mostrará en la pantalla.
Thomas Dignan

7

Para lograr esto, existen básicamente dos métodos que uso con frecuencia:

1. Usando el cursor de escape ( \c) conecho -e

Ejemplo :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eLa bandera habilita los caracteres de escape E en la cadena.
  • \ctrae el C volver ursor a la línea actual.

O

2. Usando el printfcomando

Ejemplo :

for ((i = 0; i < 5; ++i)); do
  printf "$i "
done
# 0 1 2 3 4

3

Si usa echo dentro de un if con otros comandos, como "leer", podría ignorar la configuración y de todos modos saltará a una nueva línea.


2

Solo para el Linux más popular Ubuntu y es bash:

  1. Comprueba qué shell estás usando? Principalmente a continuación funciona, de lo contrario vea esto :

    echo $0

  2. Si se imprime arriba bash, a continuación funcionará:

    printf "hello with no new line printed at end"
    O
    echo -n "hello with no new line printed at end"


1

Creo que en este momento su salida de impresión es la siguiente

~ echo -e "String1\nString2"
String1
String2

Puede usar xargspara obtener stdout multilínea en la misma línea.

 ~ echo -e "String1\nString2" | xargs
String1 String2

 ~

0

Cuando vaya y escriba su script de shell, siempre ponga la primera línea como #! / Usr / bin / env bash. Este shell no omite ni manipula secuencias de escape. ex echo "Esta es la primera línea \ n" imprime Esta es la primera línea \ 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.