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

Warum wird `while Ifs=Read` so oft verwendet, anstatt `ifs=; Während Read..`?

Es scheint, dass die normale Praxis die Einstellung von IFS außerhalb der While-Schleife platzieren würde, um die Einstellung nicht für jede Iteration zu wiederholen … Ist dies nur ein gewohnheitsmäßiger „Affen sehen, Affen tun“-Stil, wie er für diesen Affen war, bis ich ihn gelesen habe Mann liest , oder übersehe ich hier eine subtile (oder offensichtliche) Falle?

Akzeptierte Antwort:

Die Falle ist das

IFS=; while read..

setzt den IFS für die gesamte Shell-Umgebung außerhalb der Schleife, wohingegen

while IFS= read

definiert es nur für read neu Aufruf (außer in der Bourne-Shell).
Sie können das überprüfen, indem Sie eine Schleife wie

ausführen
while IFS= read xxx; ... done

dann nach einer solchen Schleife echo "blabalbla $IFS ooooooo" druckt

blabalbla  ooooooo

wohingegen nach

IFS=; read xxx; ... done

das IFS bleibt neu definiert:jetzt echo "blabalbla $IFS ooooooo" druckt

blabalbla  ooooooo

Wenn Sie also die zweite Form verwenden, müssen Sie daran denken, Folgendes zurückzusetzen:IFS=$' tn' .

Der zweite Teil dieser Frage wurde hier zusammengeführt, daher habe ich die zugehörige Antwort hier entfernt.


Linux
  1. Warum *nicht* `ls` parsen (und was stattdessen tun)?

  2. Warum friert der PC ein, während ich eine Datei auf einen Pendrive kopiere?

  3. Df sagt, ich habe 20 g mehr Speicherplatz belegt als Du. Wieso den??

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

  5. Warum wird die Laufwerks-/Partitionsnummer immer noch verwendet?

Warum ich unter Linux exa anstelle von ls verwende

Linux vs. Mac OS:15 Gründe, warum Sie Linux anstelle von Mac OS verwenden sollten

Warum verwenden einige Kernel-Programmierer goto statt einfacher While-Schleifen?

warum die Geschwisterliste verwendet wird, um die task_struct zu erhalten, während die Kinder eines Prozesses abgerufen werden

Warum haben wir 3 Arten von X-Auswahlen in LINUX?

Warum heißt meine Ethernet-Schnittstelle enp0s10 statt eth0?