Durch die Zuweisung werden die Zeilenumbruchzeichen nicht entfernt, sondern dies wird tatsächlich echogetan. Sie müssen einfach Anführungszeichen um die Zeichenfolge setzen, um diese Zeilenumbrüche beizubehalten:
echo "$testvar"
Dies ergibt das gewünschte Ergebnis. Eine Demo finden Sie im folgenden Transkript:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
Der Grund, warum Zeilenumbrüche durch Leerzeichen ersetzt werden, hat nicht nur mit dem echoBefehl zu tun , sondern ist eine Kombination von Dingen.
Wenn Sie eine Befehlszeile erhalten, bashteilen Sie diese gemäß der Dokumentation für die IFSVariable in Wörter auf :
IFS: Der interne Feldtrenner, der nach der Erweiterung für die Wortteilung verwendet wird ... der Standardwert ist <space><tab><newline>.
Das bedeutet, dass standardmäßig jedes dieser drei Zeichen verwendet werden kann, um Ihren Befehl in einzelne Wörter aufzuteilen. Danach sind die Worttrennzeichen verschwunden. Sie haben nur noch eine Liste von Wörtern übrig.
Kombinieren Sie dies mit der echoDokumentation (einem bashinternen Befehl), und Sie werden sehen, warum die Leerzeichen ausgegeben werden:
echo [-neE] [arg ...]: Gibt die durch Leerzeichen getrennten Argumente aus, gefolgt von einer neuen Zeile.
Wenn Sie verwenden echo "$x", wird die gesamte xVariable gezwungen, ein einzelnes Wort zu sein bash, daher wird sie nicht aufgeteilt. Sie können das sehen mit:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Hier countdruckt die Funktion einfach die Anzahl der angegebenen Argumente aus. Die 1 2 3und a b c dVarianten zeigen es in Aktion.
Dann versuchen wir es mit den beiden Variationen der xVariablen. Das eine ohne Anführungszeichen zeigt , dass es vier Worten "test", "1", "test"und "2". Das Hinzufügen der Anführungszeichen macht es zu einem einzigen Wort "test 1\ntest 2".