• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[solved] Leerzeichen in Dateizeilen verarbeiten (bash)

abgdf

Guru
Hallo,

ich hab da mal eine Frage zu bash:

Angenommen ich hab eine Textdatei "myfile":

Code:
Zeile1
Hallo Welt
Zeile3

Ich will die einlesen und dabei jede Zeile einzeln verarbeiten:

Code:
#!/bin/bash

a=$(cat myfile)
for i in $a; do
echo $i
done

Dann krieg ich mit "Hallo Welt" Probleme, weil bash schon beim Leerzeichen zum nächsten Schleifendurchlauf geht.
Wie kann ich erreichen, daß "Hallo Welt" als ein Wert gesehen wird (die Zeilen könnten ja auch Dateinamen sein (etwa der Output von "find") und "Hallo Welt" ein Dateiname mit Leerzeichen darin).

Vielen Dank und viele Grüße
 
OP
A

abgdf

Guru
Vielen Dank b3ll3roph0n,

das bringt mich schon ein gutes Stück weiter.
Leider geht es mit der Schleife noch nicht so ganz wie erwartet:

Code:
#!/bin/bash
a="$(cat myfile)"
for i in "$a"; do
echo "$i"

if test "$i" = "$a"; then
echo
echo '$i ist gleich $a, nicht nur jeweils eine Zeile von $a.'
echo
fi

done

Hast Du oder habt ihr noch eine Idee, wie ich jeweils eine Zeile von $a auslesen kann ?

Viele Grüße
 
Versuch es mal damit:
Code:
#!/bin/sh
FILE="myfile";

cat "$FILE" | while read i;
  do
    echo "$i";
    if [ `cat "$FILE" | wc -l` -gt 1 ]; then
      echo "1";
     else
       echo "$i ist gleich $FILE!";
    fi;
done;
Mit cat und while read wird die Datei Zeilenweise ausgelesen/verarbeitet und mit wc die Anzahl der Zeilen überprüft (wenn die Datei nur eine Zeile hat, dann sollte $i = $FILE sein :wink: ).
 
OP
A

abgdf

Guru
Hallo,

das sieht jetzt sehr gut aus. Nochmals vielen Dank.

Manchmal find ich die Shell echt schwer zu verstehen ...

Viele Grüße


Edit: Hab's auch auf meine Webseite

http://www.angelfire.com/linux/tux25/bash.html

, Abschnitt "Mehrzeilige Variablen in einer Schleife verarbeiten", gepackt.
 

sc_m

Member
Es gibt übrigens dazu eine Alternative, wobei die Variante mit read aber, insbesondere wenn viele Daten gelesen werden, die bessere ist:
Code:
#!/bin/bash
IFS=$'\n'
for i in $(cat myfile)
do
  echo "$i"
done
 
Oben