Unterschied zwischen echo -e "<string>" und echo $ "<string>"

20

Was ist der Unterschied zwischen der Verwendung

echo -e "Hello\nWorld" 

und

echo $"Hello\nWorld" 

geben sie nicht beide aus:

Hello
World
Kennzeichen
quelle
1
Hast Du es versucht? Der zweite gibt aus Hello\nWorld. Sie benötigen den -eSchalter, um Escape-Zeichen zu interpretieren.
Becko
4
Ich vermute, dass Sie es für das zweite mit einfachen Anführungszeichen schreiben wollten echo $'Hello\nWorld', die in zwei Zeilen unter Bash ausgedruckt werden.
John1024
@becko, ja ich habe es ausprobiert und beide geben genau das gleiche aus.
Mark

Antworten:

33

echo -eund echo $'...'sind beide ähnlich, da sie die folgenden Escape-Sequenzen unterstützen:

  \a     alert (bell)
  \b     backspace
  \e
  \E     an escape character
  \f     form feed
  \n     new line
  \r     carriage return
  \t     horizontal tab
  \v     vertical tab
  \\     backslash
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)
  \xHH   the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
  \uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
  \UHHHHHHHH
         the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)

Sie haben Unterschiede. Darüber hinaus echo -eunterstützt:

  \c     suppress further output
  \0nnn  the eight-bit character whose value is the octal value nnn (zero to three octal digits)

Im Gegensatz dazu $'....'unterstützt:

 \'     single quote
 \"     double quote
 \nnn   the eight-bit character whose value is the octal value nnn (one to three digits)
 \cx    a control-x character

Beachten Sie, dass die \cErweiterungen zwischen den beiden nicht kompatibel sind:

$ echo -e  'start\n\cIstop'
start
$ echo  $'start\n\cIstop'
start
        stop

Unterdrückt für echo -eoben \cweitere Ausgaben und ignoriert dabei die Istop. Im Gegensatz dazu für $'...'die \cIals Tab interpretiert.

Die optisch ähnliche Form: $"..."

Im Gegensatz dazu $'...'ist die Funktion von $"..."ganz anders. Dadurch wird die Zeichenfolge, die sie enthält, entsprechend dem aktuellen Gebietsschema übersetzt.

Die echo -eKontroverse

echo -ewird von Shells nicht allgemein unterstützt und viele sehen die -eOption als Designfehler an. Beobachten:

$ ls
-e  -n
$ echo *
$ printf "%s\n" *
-e
-n

Wie Sie sehen, echokönnen die Ergebnisse unerwartet sein , wenn das, mit dem Sie drucken, mit einem Bindestrich beginnt. Wenn Sie nicht sicher sind, dass die erste Zeichenfolge, mit der Sie drucken, echonicht mit einem Bindestrich beginnt, ist es wahrscheinlich besser, sie zu verwenden printf.

Aus diesen Gründen kommt der POSIX-Standard zu folgendem Schluss :

Für neue Anwendungen wird empfohlen, printf anstelle von echo zu verwenden.

Chet Ramey, der in bashden letzten 22 Jahren gewartet hat , stimmt zu :

[N] Der neue Code sollte printf verwenden.

John1024
quelle
1
Auch erwähnenswert, dass sowohl Chet und POSIX empfehlen die Verwendung von printfnichtecho
geirha
@geirha Sehr gute Punkte. Antwort aktualisiert.
John1024
1
Das Problem der unerwarteten Optionen von Globs (wie *) ist eigentlich nicht spezifisch echo. Dies geschieht mit jedem Befehl, der kurze oder lange Optionen erkennt (auf herkömmliche Weise geschrieben) und Dateinamenoperanden verwendet, einschließlichls . Wahrscheinlich ist die Situation etwas schlimmer, echoda (wie Ihre Quelle erwähnt) echonormalerweise nicht akzeptiert wird --, das Ende von Optionen anzugeben, während man Befehle wie schreiben kann ls -- *l. (Und eigentlich sollte man Befehle normalerweise so schreiben, wenn man Globs verwendet, die mit *oder beginnen -, insbesondere in Skripten.)
Eliah Kagan,
Vielen Dank für die ausführliche Antwort, ich habe eine Übung für mein Betriebssystem Kurs und ich brauchte einen Text zu drucken , um die Verwendung von \nEscape - Sequenz, so in der Tat ist es egal , ob ich verwenden echo -e '...', echo $'...'oderecho $"..."
Mark