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"
.
Dies liegt an der IFS- Variablen (Internal Field Separator) , die Newline enthält.
Eine Problemumgehung besteht darin, IFS vorübergehend so zurückzusetzen, dass es die neue Zeile nicht enthält :
Um diese schreckliche Veränderung für IFS rückgängig zu machen:
quelle
echo "$(IFS=''; cat text.txt)"
In Bash -ge 4 ist die Map-Datei integriert, um Zeilen von der Standardeingabe in eine Array-Variable zu lesen.
Siehe auch:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
quelle
Nur wenn jemand an einer anderen Option interessiert ist:
quelle
Ihre Variable wird von korrekt eingestellt
testvar=$(cat test.txt)
. Um diese Variable anzuzeigen, die aus neuen Zeilenzeichen besteht, fügen Sie einfach doppelte Anführungszeichen hinzu, zHier ist das vollständige Beispiel:
quelle
Das
envdir
Dienstprogramm bietet eine einfache Möglichkeit, dies zu tun.envdir
Verwendet Dateien zur Darstellung von Umgebungsvariablen, wobei Dateinamen den Namen von env var und der Inhalt von Dateien den Werten von env var zugeordnet werden. Wenn der Dateiinhalt Zeilenumbrüche enthält, wird auch die env var.Siehe https://pypi.python.org/pypi/envdir
quelle