Im Terminal von Ubuntu 18.04 LTS, wenn ich diesen Befehl schreibe:
echo -e "Hello\\\n"
Es gibt dies als Ausgabe:
Hello\n
Aber es sollte drucken, wie der Mann Seite sagt:
Hello\
Das heißt, zuerst drucken Hello
, dann \
ein Newline-Zeichen (und dann eine weitere Newline). Wo ist das Problem?
Siehe diese wenigen echo -e
Befehle und ihre Ausgabe :
man420@man420-X542UQ:~$ echo -e "HEllo\a\a\a\a\a\a\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\\\n"
HEllo\n
man420@man420-X542UQ:~$ echo -e "HEllo\a\\\n"
HEllo\n
command-line
echo
yolin00
quelle
quelle
echo
in erster Linie: verwendenprintf
.Antworten:
Schrägstriche sind speziell durch behandelt
echo -e
, aber zuerst werden sie manchmal speziell durch die Schale (die in diesem Fall behandeltbash
), nach der Shell zitiert Regeln.Das Argument
echo
sieht eigentlich so ausHello\\n
. Weil Sie bestanden haben ,-e
anecho
, es behandelt Backslash entkommt speziell und\\
wird zu einem einzigen zusammengebrochen\
. Das Finalen
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 .\
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\
.\
Zeichen folgt ein drittes\
Zeichen, das von den ersten beiden nicht betroffen ist und einem vorangestellt istn
. Istn
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 undecho
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 vonecho -e "Hello\\n"
AusgabenHello
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 Verwendungprintf
vonecho
, was in diesem Fall wäreprintf '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 istprintf 'Hello\\\n\n'
. Aber wasprintf
wirklich glänzt, ist, dass Sie zusätzliche Argumente einfügen können. Sie können anstelle von verwendenprintf '%s\n\n' 'Hello\'
, was das zweite Argument einfügt (wörtlich,Hello\
weil einfache Anführungszeichen nichts ändern)%s
.quelle