'Echo' ohne Zeilenumbruch in einem Shell-Skript

540

Ich habe ein Problem mit echoin meinem Skript:

echo -n "Some string..."

druckt

-n Some string...

und geht zur nächsten Zeile. In der Konsole funktioniert es ohne Zeilenumbruch korrekt:

Some string...
qwertz
quelle
2
Welche Bourne-Shell-Implementierung verwenden Sie? Wenn ich bashim Bourne-Shell-Modus laufe , funktioniert es hier einwandfrei. Es ist auch etwas unwahrscheinlich, dass Sie wirklich eine Bourne-Shell als interaktive Shell verwenden, oder?
FatalError
4
auf Ubuntu:echo -ne "text without new line: "; echo "some text";
zsoltii
Ich weiß, dass dies sehr alt ist, aber dies funktioniert für mich in Windows 10, um einen Punkt ohne Zeilenumbruch hinzuzufügen: echo | set / p = "."
SPlatten

Antworten:

572

Es gibt mehrere Versionen des echoBefehls mit unterschiedlichen Verhaltensweisen. Anscheinend verwendet die für Ihr Skript verwendete Shell eine Version, die nicht erkannt wird -n.

Der printfBefehl hat ein viel konsistenteres Verhalten. echoist in Ordnung für einfache Dinge wie echo hello, aber ich schlage vor, printffür etwas komplizierteres zu verwenden.

Auf welchem ​​System befinden Sie sich und welche Shell verwendet Ihr Skript?

Keith Thompson
quelle
46
Mit der Zeile zu beginnen #!/bin/bashhat funktioniert. Normalerweise arbeite ich mit Bash.
QWERZZ
Ich wünschte, es gäbe ein Windows-Äquivalent in CMD :( Soweit ich sehen kann, gibt es nicht nur Problemumgehungen, um das gleiche Verhalten zu erreichen.
KayleeFrye_onDeck
2
@kayleeFrye_onDeck: Vielleicht gibt es eine Windows-Version des printfBefehls.
Keith Thompson
Ich wünsche. echofügt immer neue Zeilen hinzu ... Die Problemumgehung ist bestenfalls ruckelig.
KayleeFrye_onDeck
2
@alper Das %ist Ihre Shell-Eingabeaufforderung. Versuchen Sie dies und beobachten Sie genau:printf hello; sleep 5
Keith Thompson
150

bash hat einen "eingebauten" Befehl namens "echo":

$ type echo
echo is a shell builtin

Zusätzlich gibt es einen "Echo" -Befehl, der eine ordnungsgemäße ausführbare Datei ist (dh die Shell gabelt und führt aus, anstatt sie /bin/echozu interpretieren echound auszuführen):

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

Das Verhalten von echoWRT zu \cund -nvariiert. Ihre beste Wahl ist die Verwendung printf, die für vier verschiedene * NIX-Geschmacksrichtungen verfügbar ist , die ich mir angesehen habe:

$ printf "a line without trailing linefeed"
$ printf "a line with trailing linefeed\n"
aqn
quelle
3
Vielen Dank für die ausführliche Antwort!
Darth Egregious
91

Versuche es mit

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

Es funktioniert für mich wie erwartet (wie ich aus Ihrer Frage verstanden habe).

Beachten Sie, dass ich diese Informationen von der manSeite erhalten habe. Auf der manSeite wird auch darauf hingewiesen, dass die Shell möglicherweise eine eigene Version von hat echo, und ich bin nicht sicher, ob bashsie eine eigene Version hat.

Sonny
quelle
+1 für den Hinweis auf die richtige Richtung, obwohl ein Echo, das die Option -ne nicht erkennt, die Option -e wahrscheinlich auch nicht erkennt (oder benötigt), sodass Sie wahrscheinlich echo "some string...\c"stattdessen nur sagen möchten . Wenn Sie jedoch mehrere Bash-Varianten mit stark unterschiedlichen Echo-Befehlen unterstützen müssen, ist es wahrscheinlich besser, printf zu verwenden, oder Sie müssen die Funktionen der Echo-Befehle mit so etwas überprüfen [ -n "$( echo -e )" ] && echo "sh stuff\c" || echo -e "bash stuff\c"(zumindest Bash unterstützt auch \ c, sodass Sie die nicht verwenden müssen -n Option, aber Sie brauchen das -e für Bash)
Timo
Für mich macht dies genau das, was -n im Fall von OP tut: gibt das Literal -e aus. Ich denke, printf ist in der Tat konsistenter
aexl
-e funktioniert nicht in einem Posix-Shell-Skript, sondern wird stattdessen auf dem Bildschirm ausgegeben.
Thomas Dignan
7

Um dies zu erreichen, gibt es grundsätzlich zwei Methoden, die ich häufig verwende:

1. Verwenden Sie das Cursor- Escape-Zeichen ( \c) mitecho -e

Beispiel :

for i in {0..10..2}; do
  echo -e "$i \c"              
done
# 0 2 4 6 8 10
  • -eDas Flag aktiviert die E- Scape-Zeichen in der Zeichenfolge.
  • \cbringt den C ursor zurück in die aktuelle Zeile.

ODER

2. Verwenden Sie den printfBefehl

Beispiel :

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

Wenn Sie echo in einem if mit anderen Befehlen wie "read" verwenden, wird die Einstellung möglicherweise ignoriert und es wird trotzdem zu einer neuen Zeile gesprungen.

Alexandre Strube
quelle
2

Nur für das beliebteste Linux Ubuntu & es ist bash:

  1. Überprüfen Sie, welche Shell Sie verwenden? Meistens funktioniert unten, sonst sehen Sie das :

    echo $0

  2. Wenn oben gedruckt bashwird, funktioniert unten:

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

Manohar Reddy Poreddy
quelle
1

Ich glaube im Moment, dass Ihre Ausgabe wie folgt gedruckt wird

~ echo -e "String1\nString2"
String1
String2

Sie können verwenden xargs, um mehrzeilige Standardausgabe in dieselbe Zeile zu bringen.

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

 ~
rɑːdʒɑ
quelle
0

Wenn Sie Ihr Shell-Skript schreiben, setzen Sie die erste Zeile immer als #! / Usr / bin / env bash. Diese Shell lässt keine Escape-Sequenzen aus oder manipuliert sie nicht. ex echo "Dies ist die erste \ n Zeile" wird gedruckt. Dies ist die erste \ n Zeile.

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