Bash, liest Zeile für Zeile aus der Datei, mit IFS
Ich habe diesen code aus http://bash.cyberciti.biz/guide/While_loop, verwendet zu Lesen, Zeile für Zeile aus einer Datei
file=/etc/resolv.conf
while IFS= read -r line
do
# echo line is stored in $line
echo $line
done < "$file"
den Teil, den ich nicht verstehe, ist IFS=
und wie es trägt zu dieser Funktionalität. Kann jemand erklären mir das an? Danke.
Check das äquivalent Frage auf Unix & Linux.
InformationsquelleAutor wakandan | 2010-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
IFS ist eine variable für die Zeile, Trennzeichen (oder eigentlich "Internal Field Separator"). Dieser code wird effektiv leer aus, der line separator für den read-Befehl und legen Sie es auf den Standardwert zurückgesetzt. Manchmal wenns geändert wird irgendwo im code durch Anwender, die andere "line" enden, wie beim Lesen Satz für Satz (
IFS=.
) oder so ähnlich.Ich vermute, Sie enthalten die
IFS=
hier nur um sicherzustellen, dass es funktioniert, oder jeder, unabhängig vom vorherigen Wert auf die IFS-variable. Der code sollte weiterhin funktionieren, ohneIFS=
IFS=
es funktioniert immer noch gut. Vielen Dank.user121870, ja, es ist erlaubt. Wenn das einfügen von Variablen vor einem Befehl, den er variable wird sichtbar, dass der Befehl nur. Dies gilt für alle Bash-Befehle, auch diejenigen, die Sie schreiben in Ihrem terminal selbst. Versuchen Sie es zum Beispiel mit diesem Befehl: "MANWIDTH=20 man bash".
Einstellung
IFS
auf einen null-nicht legen Sie es auf den Standardwert (das ist space, tab, newline). Es ist nicht für Zeilenenden nur, es zu tun pflegte, word-splitting). Zu Lesen, Satz für Satz, verwenden Sie die-d
delimiter-option mitread
.Diese Antwort ist falsch --
IFS
wird auf eine leere Zeichenfolge festgelegt, um zu verhindern, dassread
aus den stripping führende und nachfolgende Leerzeichen aus jeder Zeile.IFS ist nicht eine Linie, separator, es ist ein Feld separator. Das bedeutet, dass es verwendet, um separate Linien und innerhalb der Linien. Aber in diesem Fall, da Sie mit
read
mit einem einzigen output-variable, es funktioniert. Zum Beispiel, wenn Sie wollen parse /etc/resolv.conf schneller, können Sie mitwhile IFS=' ' read -r name address
aufteilen der Felder in der gleichen operation.InformationsquelleAutor Emil Vikström
In diesem Fall
IFS
wird auf eine leere Zeichenfolge festgelegt, um zu verhindern, dassread
aus den stripping führende und nachfolgende Leerzeichen aus der Zeile.Ändern
IFS
ist in der Regel getan, um zu Steuern, wie die Eingabe gliedert sich in mehrere Felder. Aber in diesem Fall, denn es gibt nur eine variable nameread
,read
nicht immer aufteilen der Eingabe in mehrere Felder unabhängig vom Wert derIFS
. Es wird jedoch, entfernen Sie die führenden und nachfolgende Leerzeichen werden als ermächtigte in der POSIX-Spezifikation (vorausgesetzt, der Wert desIFS
enthält Leerzeichen oder nicht gesetzt ist).Finden Sie in der POSIX-Spezifikation für Lesen und Feld aufteilen für details über, wie es funktioniert.
InformationsquelleAutor Richard Hansen
In dem Dritten Beispiel auf dieser Seite, Einstellung
IFS
zu null verhindert, dass word splitting, die macht, dass der code nicht funktioniert. Hier ist das code:Wie geschrieben, alle Wörter in der Zeile gespeichert, in
field1
undfield2
usw., leer sind. Ändern Sie die Zeile wie dieses und es funktioniert einwandfrei:InformationsquelleAutor Dennis Williamson
Machen
IFS
einen echten line-separator, verwenden SieIFS=$'\012'
.IFS=
im Befehl, und erläutern Sie seine Verwendung. Und durch die Art und Weise,IFS=$'\n'
wäre (wohl) weniger kryptisch.Ganz richtig. Aber das Teil hat im wesentlichen beantwortet wurden, und diese sind die blutigen details. Vielleicht diese Fragen sollten berücksichtigt werden beantwortet.
Wenn die Frage schon beantwortet wurde, dann hat es keinen Sinn, das hinzufügen von Antworten, die nicht die Frage beantworten. Na gut, es ist Ihre Wahl; vielleicht wirst du auch bekommen upvotes. Oder nicht. Warten und sehen.
InformationsquelleAutor user3673660