Leerzeichen bei For-In-Schleifen in der bash

Im Artikel Dateinamen mit Leerzeichen auf der Kommandozeile verarbeiten habe ich beschrieben, wie man Ärger mit Leerzeichen in Dateinamen umgeht. Heute geht es um Daten, die innerhalb einer For-In-Schleife aus einer Datei gelesen werden und die Leerzeichen enthalten.

Wenn wir eine Datei mit folgendem Inhalt haben:

klaus rechner1
martin rechner3
dieter rechner7

Und wir lassen diese von folgendem Script einlesen und wieder ausgeben (was natürlich recht sinnfrei ist, hier aber nur zur Veranschaulichung dienen soll):

#!/bin/bash
for ZEILE in `cat daten`
do
  echo $ZEILE
done

Dann kommt sowas raus:

klaus
rechner1
martin
rechner3
dieter
rechner7

Durch die Leerzeichen werden die Daten-Zeilen zerteilt. Damit das nicht passiert, setzt man den „Input Field Separator“ $IFS auf ‚\n‘ (Standard ist ein “ \n\t“):

#!/bin/bash
Newline=$'\n'
IFS=$Newline
for ZEILE in `cat daten`
do
echo $ZEILE
done
IFS=

Dann sieht das Ergebnis wie erwartet und gewünscht aus:

klaus rechner1
martin rechner3
dieter rechner7

3 Gedanken zu „Leerzeichen bei For-In-Schleifen in der bash

  1. Rapha

    Boah, Hammer!
    Vielen Dank! War bis grade eben voll am Verzweifeln. Dank deiner Hilfe kam ich endlich weiter! Danke!

  2. Speefak

    Wie sieht das denn aus wenn ich eine Variable mit Leerzeichen in einer for Schleife verarbeiten möchte ? Ich habe eine etwas unkonventionelle Lösung : beim Einlesen einer Datei in die Variable XYZ ersetzte ich mit Hilfe von tr alle Leerzeichnen durch ein Zeichen welches in der einzulesenden Datei nicht vorkommt, z.B. § . Die Variable ABC kann ich nun mit der for Schleife zeilenweise verarbeiten und jeder weitere Zugriff auf die Datei ( und SSD/HDD ) kann somit vermieden werden. Nach dem Einlesen der Variable durch die for Schleife ersetze ich wieder mit tr das „Umwegzeichen“ ( in diesem Fall § ) mit Leerzeichen.

    XYZ=$(cat datei | tr " " §  )	
    for LOOP in $XYZ; do 
    	 XYZ=$(echo $LOOP | tr "§" " ")
    	VAR1=$(echo $XYZ | foo bar bla)
    	VAR2=$(echo $XYZ | foo bar bla)
    	VAR3=$(echo $XYZ | foo bar bla)
    done
    

    Der Vorteil gegenüber dem Auslesen einer Datei ist die Geschwindigkeit, da die Variablen im Speicher vorgehalten werden und nicht immer auf die SSD/HDD zugegriffen werden muss.

    Auf eine Methode wie man dennoch eine Variable mit Leerzeichen ohne den o.g. Umweg in die for Schleife bekommt bin noch nicht gestoßen. Für Tipps wäre ich dankbar 😉

  3. romeofox Beitragsautor

    Das sollte genauso wie von mir oben beschrieben gehen. Ob man die Datei in der Schleife oder direkt in eine Variable einließt, bleibt sich doch gleich:

    Newline=$'\n'
    IFS=$Newline
    XYZ=`cat datei`
    for ZEILE in $XYZ
    do
      echo $ZEILE
    done
    IFS=
    

    Ich hab’s aber nicht ausprobiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.