Ich dachte immer, dass bash umgekehrte Schrägstriche gleich behandelt, wenn sie ohne oder mit doppelten Anführungszeichen verwendet werden, aber ich habe mich geirrt:
[[email protected] ~]$ echo "foo \ "
foo \
[[email protected] ~]$ echo foo \ # Space after \
foo
Also dachte ich, Backslashes werden immer gedruckt, wenn doppelte Anführungszeichen verwendet werden, aber:
[[email protected] ~]$ echo "foo \" "
foo "
[[email protected] ~]$ echo "foo \\ "
foo \
Warum wird der Backslash in der ersten Codezeile angezeigt?
Akzeptierte Antwort:
Abschnitt 3.1.2.3 Doppelte Anführungszeichen des GNU Bash-Handbuchs sagt:
Der Backslash behält seine besondere Bedeutung nur, wenn ihm eines der
folgenden Zeichen folgt:‘$
’, ‚`
’, ‘"
’, ‘\
’, oder newline
. In doppelten Anführungszeichen werden Backslashes, denen eines
dieser Zeichen folgt, entfernt. Backslashes vor Zeichen
ohne besondere Bedeutung bleiben unverändert. Ein doppeltes Anführungszeichen kann
innerhalb doppelter Anführungszeichen gesetzt werden, indem ihm ein umgekehrter Schrägstrich vorangestellt wird. Wenn
aktiviert ist, wird die Verlaufserweiterung durchgeführt, es sei denn, ein „!
’, das
in doppelten Anführungszeichen steht, wird mit einem Backslash maskiert. Der Backslash vor
dem ‘!
“ wird nicht entfernt.
Also \
in doppelten Anführungszeichen wird sowohl von \
unterschiedlich behandelt in einfachen Anführungszeichen und \
externe Anführungszeichen. Es wird wörtlich behandelt, es sei denn, es kann bewirken, dass ein Zeichen wörtlich behandelt wird, das andernfalls in doppelten Anführungszeichen eine besondere Bedeutung haben könnte.
Beachten Sie, dass Sequenzen wie \'
, \?
, und \*
werden wörtlich behandelt und der Backslash wird nicht entfernt, da '
, ?
und *
haben bereits keine besondere Bedeutung, wenn sie in doppelte Anführungszeichen eingeschlossen sind.