entsprechendGNU-Dokument,
Der Backslash behält seine besondere Bedeutung nur, wenn ihm eines der folgenden Zeichen folgt: '$', '`', '"', '\' oder Newline. In doppelten Anführungszeichen werden Backslashs, denen eines dieser Zeichen folgt, entfernt.
Ich habe es versucht
p="a\$b";echo $p # a$b
p="a\`b";echo $p # a`b
p="a\"b";echo $p # a"b
p="a\\b";echo $p # a\b
alles ist ok. Aber Newline??
p="a\newlineb";echo $p # a\newlineb
Was bedeutet „Newline“ im Dokument?
Antwort1
Newline ist der Name des Newline-Zeichens, also des Zeichens, das \n
in C normalerweise so geschrieben wird:
$ p="a\
b"; echo "$p"
ab
Das Ergebnis ist, ab
dass nicht, \a<newline>b
da dieDer POSIX-Standard besagt:
Ein nicht in Anführungszeichen gesetztes A
<backslash>
soll den Literalwert des folgenden Zeichens beibehalten, mit Ausnahme von a<newline>
. Wenn auf das<newline>
ein folgt,<backslash>
soll die Shell dies als Zeilenfortsetzung interpretieren. Das<backslash>
und<newline>
muss entfernt werden, bevor die Eingabe in Token aufgeteilt wird. Da das Escapezeichen<newline>
vollständig aus der Eingabe entfernt und nicht durch ein Leerzeichen ersetzt wird, kann es nicht als Tokentrennzeichen dienen.
Aber die SaiteIstin Anführungszeichen gesetzt... Nun, das ist ein Sonderfall:
Das Zeichen
<backslash>
behält seine besondere Bedeutung als Escape-Zeichen nur, wenn darauf eines der folgenden Zeichen folgt, die als besonders gelten:$
,`
,"
,\
,<newline>
.
Die Zeichenfolge in doppelten Anführungszeichen bedeutet, dass der Backslash-Newline so interpretiert wird, als wäre ernichtüberhaupt in Anführungszeichen gesetzt, was bedeutet, dass es als Zeilenfortsetzung fungiert und sowohl der Backslash als auch die neue Zeile entfernt werden.
Beachten Sie, dass dies bei der Zuweisung zur p
Variablen geschieht und nicht, wenn Sie echo
sie ausführen.
Siehe auchSicherheitsimplikationen, wenn vergessen wird, eine Variable in Bash/POSIX-Shells in Anführungszeichen zu setzenüber die Notwendigkeit, Ihre Variablen immer in Anführungszeichen zu setzen.