Die folgenden paar Threads auf dieser Seite und StackOverflow waren hilfreich, um zu verstehen, wie IFS
funktioniert:
- Was ist IFS im Zusammenhang mit for looping?
- Wie man die Zeilen einer Datei durchläuft
- Bash, Zeile für Zeile aus Datei lesen, mit IFS
Aber ich habe noch ein paar kurze Fragen. Ich beschloss, sie im selben Beitrag zu fragen, da ich denke, dass dies zukünftigen Lesern helfen könnte:
F1. IFS
wird typischerweise im Zusammenhang mit „Field Splitting“ diskutiert. Ist Feldaufteilung dasselbe wie Wortaufteilung ?
F2: Die POSIX-Spezifikation sagt:
Wenn der Wert von IFS null ist, wird keine Feldaufteilung durchgeführt.
Setzt IFS=
dasselbe wie das Setzen von IFS
zu null? Ist dies gemeint, wenn Sie es auf eine empty string
setzen? auch?
F3: In der POSIX-Spezifikation habe ich Folgendes gelesen:
Wenn IFS nicht gesetzt ist, soll sich die Shell so verhalten, als ob der Wert von IFS <space>, <tab> and <newline>
wäre
Angenommen, ich möchte den Standardwert von IFS
wiederherstellen . Wie mache ich das? (genauer gesagt, wie beziehe ich mich auf <tab>
und <newline>
?)
F4: Schließlich, wie würde dieser Code:
while IFS= read -r line
do
echo $line
done < /path_to_text_file
verhalten, wenn wir die erste Zeile in
ändernwhile read -r line # Use the default IFS value
oder an:
while IFS=' ' read -r line
Akzeptierte Antwort:
- Ja, sie sind gleich.
- Ja.
- In Bash und ähnlichen Shells könnten Sie so etwas tun wie
IFS=$' tn'
. Andernfalls könnten Sie die wörtlichen Steuercodes einfügen, indem Sie[space] CTRL+V [tab] CTRL+V [enter]
verwenden . Wenn Sie dies jedoch vorhaben, verwenden Sie besser eine andere Variable, um das alteIFS
zwischenzuspeichern Wert und stellen Sie ihn anschließend wieder her (oder überschreiben Sie ihn vorübergehend für einen Befehl, indem Sie denvar=foo command
verwenden Syntax). - Das erste Code-Snippet fügt die gesamte gelesene Zeile wörtlich in
$line
ein , da es keine Feldtrennzeichen gibt, für die eine Wortaufteilung durchgeführt werden könnte. Denken Sie jedoch daran, dass, da viele Shells cstrings verwenden, um Strings zu speichern, die erste Instanz einer NUL immer noch den Anschein erwecken kann, dass sie vorzeitig beendet wird. - Das zweite Code-Snippet fügt möglicherweise keine exakte Kopie der Eingabe in
$line
ein . Wenn beispielsweise mehrere aufeinanderfolgende Feldtrennzeichen vorhanden sind, werden sie zu einer einzigen Instanz des ersten Elements gemacht. Dies wird oft als Verlust des umgebenden Leerraums erkannt. - Das dritte Code-Snippet macht dasselbe wie das zweite, außer dass es nur bei einem Leerzeichen geteilt wird (nicht das übliche Leerzeichen, der Tabulator oder der Zeilenumbruch).
- Das erste Code-Snippet fügt die gesamte gelesene Zeile wörtlich in