Schrägstriche sind speziell durch behandelt echo -e
, aber zuerst werden sie manchmal speziell durch die Schale (die in diesem Fall behandelt bash
), nach der Shell zitiert Regeln.
Das Argument echo
sieht eigentlich so aus Hello\\n
. Weil Sie bestanden haben , -e
an echo
, es behandelt Backslash entkommt speziell und \\
wird zu einem einzigen zusammengebrochen \
. Das Finale n
wird nicht geflüchtet, so dass es buchstäblich erscheint.
Der Grund dafür ist, dass echo
die Shell vor und unabhängig von der eigentlichen Operation in einigen Kontexten speziell behandelt,\
in anderen jedoch nicht. Unquoted \
Zeichen werden immer speziell behandelt, in einfachen Anführungszeichen \
werden nie speziell behandelt, aber die Behandlung von doppelten Anführungszeichen \
Zeichen, wie in dem Befehl , den Sie lief, ist subtiler und kompliziert.
Wenn die Shell in einem Befehl auf doppelt in Anführungszeichen gesetzten Text stößt "Hello\\\n"
, wird dieser \
wie ein Escape-Zeichen behandelt, wenn er einem Zeichen vorangeht, das in Anführungszeichen eine besondere Bedeutung haben kann, und nicht anders .
- Weil
\
manchmal eine besondere Bedeutung im Innern ist ""
, hat eine , die einer \
anderen unmittelbar vorausgeht, \
den Effekt, diese Sekunde zu zitieren \
. In doppelten Anführungszeichen werden also die ersten \\
zusammengefasst \
.
- Nach diesen ersten beiden
\
Zeichen folgt ein drittes \
Zeichen, das von den ersten beiden nicht betroffen ist und einem vorangestellt ist n
. Ist n
aber kein Zeichen, das in Anführungszeichen speziell behandelt wird, so wird das \
davor in dieser Situation nicht speziell behandelt. So \n
bleibt \n
.
Der Effekt ist, dass in doppelten Anführungszeichen \\\n
interpretiert wird als \\n
.
Wenn echo -e
angezeigt wird \\n
, entfernt der erste \
die spezielle Bedeutung aus dem zweiten und echo
druckt \n
buchstäblich für diesen Text.
Wenn es Ihr Ziel ist, Hello
mit einer zusätzlichen Zeile ohne Backslashes zu drucken (die Frage war ursprünglich nicht eindeutig, und ich denke, es ist ein nützliches Beispiel), dann besteht eine Lösung darin, a zu entfernen \
. Ausführen von echo -e "Hello\\n"
Ausgaben Hello
mit einem zusätzlichen Zeilenumbruch am Ende.
Eine bessere Lösung besteht darin, einfache Anführungszeichen zu verwenden und zu schreiben echo -e 'Hello\n'
. Einfache Anführungszeichen sind die stärkste Form des Zitierens. Eine noch bessere Lösung ist in der Regel die Verwendung printf
von echo
, was in diesem Fall wäre printf 'Hello\n\n'
.
Wenn Sie Hello\
den Backslash gefolgt von einem zusätzlichen Zeilenumbruch drucken möchten , ist der Ansatz mit doppelten Anführungszeichen möglich, aber umständlich. Um es herausfinden , Arbeit rückwärts: echo -e
Konvertiten \\
zu \
und \n
auf eine neue Zeile, und doppelklicken zitiert Konvertiten \\
zu \
, so dass Sie es mit sechs Schrägstriche tun können ( echo -e "Hello\\\\\\n"
), da \\n
verwandelt sich in \n
aufgrund eines umgekehrten Schrägstrich ein anderes zu entkommen. Sie können dies auch mit fünf tun, da doppelte Anführungszeichen beibehalten werden, \n
wenn das \
nicht maskiert wird.
Dies zeigt den Vorteil echo -e
der einfachen Anführungszeichen : Fügen Sie einfach alles, was Sie wollen , in die einfachen Anführungszeichen ein ( echo -e 'Hello\\\n'
). printf
ist auch gut hier. Eine Möglichkeit ist printf 'Hello\\\n\n'
. Aber was printf
wirklich glänzt, ist, dass Sie zusätzliche Argumente einfügen können. Sie können anstelle von verwenden printf '%s\n\n' 'Hello\'
, was das zweite Argument einfügt (wörtlich, Hello\
weil einfache Anführungszeichen nichts ändern) %s
.