Durch die Zuweisung werden die Zeilenumbruchzeichen nicht entfernt, sondern dies wird tatsächlich echo
getan. 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 echo
Befehl zu tun , sondern ist eine Kombination von Dingen.
Wenn Sie eine Befehlszeile erhalten, bash
teilen Sie diese gemäß der Dokumentation für die IFS
Variable 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 echo
Dokumentation (einem bash
internen 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 x
Variable 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 count
druckt die Funktion einfach die Anzahl der angegebenen Argumente aus. Die 1 2 3
und a b c d
Varianten zeigen es in Aktion.
Dann versuchen wir es mit den beiden Variationen der x
Variablen. 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"
.