Dies ist weil bash
und echo -e
kombiniert. Vonman 1 bash
Ein nicht zitierter Backslash (
\
) ist das Escape-Zeichen. Der Literalwert des nächsten Zeichens, mit Ausnahme von, wird beibehalten<newline>
. […]Zeichen in doppelten Anführungszeichen bewahrt den wörtlichen Wert aller Zeichen innerhalb der Anführungszeichen, mit Ausnahme von umschließenden
$
, `,\
[...] Der Backslash seiner besondere Bedeutung behält nur dann, wenn durch eine der folgenden Zeichen folgen:$
,`,"
,\
, oder<newline>
.
Der Punkt ist: doppelte Anführungszeichen sind nicht immer etwas Besonderes.
echo
Im Allgemeinen gibt es verschiedene Implementierungen, es ist ein eingebauter bash
; Das Wichtigste hier ist dieses Verhalten:
Wenn
-e
aktiviert, werden die folgenden Sequenzen erkannt:
\\
Backslash
[…]
\n
neue Zeile
Jetzt können wir entschlüsseln:
echo -e "\ Hello!"
- nichts Besonderesbash
, nichts Besonderesecho
;\
bleibtecho -e "\\ Hello!"
- Der Erste\
sagtbash
, der Zweite\
wörtlich zu behandeln .echo
bekommt\ Hello!
und handelt wie oben.echo -e "\\\ Hello!"
- Der Erste\
sagtbash
, der Zweite\
wörtlich zu behandeln .echo
bekommt\\ Hello!
und (wegen-e
) erkennt es\\
als\
.echo -e "\\\\ Hello!"
- Der Erste\
sagtbash
, der Zweite\
wörtlich zu behandeln . der dritte sagt dasselbe über den vierten;echo
bekommt\\ Hello!
und (wegen-e
) erkennt es\\
als\
.echo -e "\\\\\ Hello!"
- Der Erste\
sagtbash
, der Zweite\
wörtlich zu behandeln . der dritte sagt dasselbe über den vierten; der letzte ist nicht besonders;echo
erhält\\\ Hello!
und (wegen-e
) erkennt die Initiale\\
als\
, die letzte\
bleibt intakt.
Und so weiter. Wie Sie sehen, führen bis zu vier aufeinanderfolgende Backslashes zu einem Ergebnis. Deshalb brauchst du (mindestens) neun von ihnen, um drei zu bekommen. 9 = 4 + 4 + 1.
Jetzt mit \n
:
echo -e "\n Hello!"
- Es gibt nichts Besonderesbash
, das Echo erhält die gleiche Zeichenfolge und wird (wegen-e
)\n
als Newline interpretiert .echo -e "\\n Hello!"
-bash
interpretiert\\
als\
;echo
bekommt\n Hello!
und das Ergebnis ist das gleiche wie oben.echo -e "\\\n Hello!"
-bash
interpretiert die Initiale\\
als\
;echo
bekommt\\n Hello!
und (wegen-e
) es\\
als ein Literal interpretiert\
, das gedruckt werden muss.
Die Ergebnisse wären anders, mit '
statt "
(wegen des unterschiedlichen bash
Verhalten) oder ohne -e
(unterschiedliches echo
Verhalten).