GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wenns verstehen?

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

ändern
while read -r line # Use the default IFS value

oder an:

while IFS=' ' read -r line

Akzeptierte Antwort:

  1. Ja, sie sind gleich.
  2. Ja.
  3. 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 alte IFS zwischenzuspeichern Wert und stellen Sie ihn anschließend wieder her (oder überschreiben Sie ihn vorübergehend für einen Befehl, indem Sie den var=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).
Siehe auch:„IFS=read -r line“ verstehen?
Linux
  1. Wie liest man eine IP-Adresse rückwärts?

  2. Das „Wenn“?

  3. Warum hat Ifs in `while Ifs=Read..` keine Auswirkung?

  4. Linux-Desktop verstehen?

  5. rsyslog-Aktionen verstehen

Ansible vs. Kubernetes:Die Unterschiede verstehen

Grundlegendes zu Linux-Dateiberechtigungen

Bash las Befehl

So lesen Sie eine Datei Zeile für Zeile in Bash

Benutzer-Mail lesen

Prozesse unter Linux verstehen