\n
kein newline ist; Es ist eine Escape-Sequenz, die in einigen Situationen in eine neue Zeile übersetzt, aber Sie haben es in einer dieser Situationen nicht verwendet. Die Variable $z
wird nicht geschlossen und enthält eine neue Zeile, nur umgekehrter Schrägstrich gefolgt von "n".Als Ergebnis ist das, was tatsächlich ausgeführt hat wird:
$ echo a\necho b
anecho b
Sie entweder ein Semikolon stattdessen verwenden können (das keine Übersetzung erfordert) oder \n
in einem Kontext verwenden, wo es wird in eine neue Zeile übersetzt werden:
$ newline=$'\n'
$ x='echo a'
$ y='echo b'
$ z="$x$newline$y"
$ eval "$z"
a
b
Beachten Sie die doppelten Anführungszeichen um "$z"
- sie sind tatsächlich kritisch hier. Ohne sie teilt bash den Wert von $z
word-split und verwandelt alle Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) in Wortumbrüche. Wenn das geschieht, welche die Worte „echo“ „a“ „echo“ b“, effektiv die Newline in einen Raum dreht eval
bekommen:
$ eval $z
a echo b
Dies ist eine weitere in der langen Liste der Fälle, in denen es wichtig ist, double-quote Variablenreferenzen
Versuchen Sie, mit ';', nicht '\ n' –
oder mit' && 'zu trennen, wenn Sie sicherstellen möchten, dass der spätere cmd exec wird, wenn der vorherige erfolgreich ausgeführt wurde. – Kent
@Kent '&&' funktioniert nicht, wenn ein vorheriger Befehl unvollständig ist, z. 'x = 'wenn wahr'; y = 'dann echo a; fi'' –