[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: bash



Roland M. Kruggel:

>ich muss über Dateien die im /tmp liegen iterieren.

>ein
>  FILES=`ls /tmp/*.name.ext`

>funktioniert eigentlich ganz gut. So lange mindestens ein file 
>vorhanden ist. Sonst steigt ls mit einer feglermeldung aus.

Achtung: Das funktioniert nur, wenn Dateinamen keine
White-Space-Zeichen enthalten. Und das kannst du in /tmp, wo
jeder Dateien erzeugen kann, nicht ausschließen!

Sauber geht's so:

Annahme: Der Kommandointerpreter ist bourne-shell- oder
posix-shell-kompatibel:

# Liste der positional Parameters leeren:
set ''; shift
for file in /tmp/*.name.ext
do
   # stelle mit sicher, dass Datei wirklich vorhanden:
   test -e "$file" && set -- ${1+"$@"} "$file"
done

# Jetzt sind die gefundenen Namen in $@, der Liste der positional
# Parameters und die Anzahl in $#

Warum ist es innerhalb der Schleife nötig, zu überprüfen, ob der
"gefundene" Name wirklich vorhanden ist?

Antwort: Wenn das Bourne-Shell zu einem Dateinamens-Muster in
einer Parameterliste oder in einem For-Schleifen-Kopf keine Datei
findet, wird das Muster nicht aus der Liste entfernt sondern
unverändert in die Liste gesetzt, d.h. wenn keine Datei gefunden
wurde, enthält die Liste das eine Wort '/tmp/*.name.ext'

-- 
Bitte in die Adressierung auch meinen|Please put my full name also into
Vor- u. Nachnamen stellen z.B.       |the recipient like
Friedhelm Waitzmann <xxx@example>, (Friedhelm Waitzmann) xxx@example,
"Waitzmann, Friedhelm" <xxx@example>



Reply to: