Ich habe diesen Thread gelesen: Wie werden die Zeilen einer Datei durchlaufen?
Was ist IFS
? Und wie wird es im Kontext von for
-loops verwendet?
Ich habe diesen Thread gelesen: Wie werden die Zeilen einer Datei durchlaufen?
Was ist IFS
? Und wie wird es im Kontext von for
-loops verwendet?
IFS
steht für - es ist ein Zeichen, das Felder trennt. In dem Beispiel, das Sie gepostet haben, ist es auf das Zeichen für eine neue Zeile ( ) gesetzt. Nachdem Sie dies eingestellt haben, wird der Text zeilenweise verarbeitet. In diesem Beispiel können Sie den Wert von (in einen Buchstaben, den Sie in Ihrer Eingabedatei haben) ändern und prüfen, wie der Text aufgeteilt wird.Input
Internal Field Separator
\n
for
IFS
Übrigens, von der Antwort, die Sie gepostet haben, ist die zweite Lösung die empfohlene ...
Wie @jasonwryan bemerkt hat, ist es nicht Input
aber Internal
. Name Input
kam von awk
dem es auch OFS
- gibt Output Field Separator
.
S
für separator in der Bourne-Shell war, woher es stammt. In der Korn-Shell und den meisten anderen Bourne-ähnlichen Shells, wie sie jetzt von spezifiziert wurdenPOSIX
, ist derS
is for Delimiter (erweitern Sie einfach Ihre Vorstellungskraft), daA::B:
er beispielsweise in "A", "" und "B" aufgeteilt ist (ohne Extrakosten) ""). Das unterscheidet sich vonawk
'sFS
oder ders
Parametererweiterung vonzsh
.IFS
ist nicht direkt mit dem Schleifen verbunden, sondern mit dem Teilen von Wörtern.IFS
Legt indirekt fest, wie die Ausgabe des Befehls in Teile aufgeteilt wird, über die die Schleife iteriert.Wenn Sie eine ungeschützte Variablensubstitution
$foo
oder Befehlssubstitution haben$(foo)
, gibt es zwei Fälle:"$foo"
oder in einer variablen Zuweisung erfolgtx=$foo
, wird der aus der Ersetzung resultierende String unverändert verwendet.$IFS
wird, wird als Worttrennzeichen betrachtet. Zum BeispielIFS=":"; foo="12:34::78"; echo $foo
Ausdrucke12 34 78
(mit zwei Leerzeichen zwischen34
und78
, da es ein leeres Wort gibt).foo="*"; echo $foo
die Liste der Dateien im aktuellen Verzeichnis.Erwarten Sie für Schleifen wie für viele andere Kontexte eine Liste von Wörtern. So
zerbricht
$(foo)
in Wörter und behandelt jedes Wort als Glob-Muster. Der Standardwert vonIFS
ist space, tab und newline . Wenn alsofoo
zwei Zeilen ausgedruckt werdenhello world
undhowdy
dann der Schleifenkörper mitx=hello
, dannx=world
und ausgeführt wirdx=howdy
. WennIFS
explizit geändert wird, um nur eine neue Zeile zu enthalten, wird die Schleife fürhello world
und ausgeführthowdy
. WennIFS
geändert zu werdeno
, dann wird die Schleife für ausgeführthell
, w
,rldh
(wobei
ein Zeilenendezeichen) , undwdy
.quelle
"IFS indirectly determines how ..."
?IFS
(direkt) bestimmt, wie die Ausgabe der Befehlssubstitution aufgeteilt wird, die dann (indirekt) bestimmt, worüber die Schleife durchläuft.Von
man bash
Dies ist eine der internen Variablen von Bash. Es legt fest, wie Bash Felder oder Wortgrenzen erkennt, wenn Zeichenfolgen interpretiert werden.
Die Standardeinstellung ist Leerzeichen (Leerzeichen, Tabulator und Zeilenvorschub). Sie kann jedoch geändert werden, um beispielsweise eine durch Kommas getrennte Datendatei zu analysieren.
http://tldp.org/LDP/abs/html/internalvariables.html
quelle
Lassen Sie mich zusätzlich zu den bisherigen tollen Antworten hinzufügen, dass IFS in Kombination mit set in einfachen Fällen sehr nützlich für effizientes und portables Parsen ist . Effizient, da die Verwendung von Subshells und Laichwerkzeugen wie grep oder sed vermieden wird:
Beachten Sie nur, dass wir den vorherigen Wert von IFS speichern und wiederherstellen müssen , um unerwünschte Brüche in anderen Teilen des Skripts zu vermeiden.
quelle