'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...
qwertz
fuente
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?

Keith Thompson
fuente
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"
aqn
fuente
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.

Hijo
fuente
+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
Genio
fuente
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.

Alexandre Strube
fuente
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"

Manohar Reddy Poreddy
fuente
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

 ~
rɑːdʒɑ
fuente
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.

Amit Singh
fuente
0
enable -n echo
echo -n "Some string..."
Riccardo La Marca
fuente