Schleife durch Funktion ersetzen?

13/09/2010 - 08:54 von Michael Schuerig | Report spam
Ich habe einige Skripte die alle etwa so aussehen und sich nur im
Schleifenkörper unterscheiden

find . -maxdepth 1 -type d -name 'foo_*' -print | while read dir ; do
echo "Ich mach jetzt was..."
( cd $dir && mach_was )
done

Die àußere Schleife möchte ich einmal in einer Funktion definieren und
dann nur noch benutzen. Ja, ich könnte natürlich auch Ruby nehmen, aber
immerhin sind auch in der Shell Funktionen höherer Ordnung begrenzt
möglich:

# foo_loop:
#!/bin/sh
find . -maxdepth 1 -type d -name 'foo_*' -print | while read dir ; do
( cd $dir && $* )
done

foo_loop "echo Ich arbeite jetzt in $1"

Das geht ganz ordentlich, wenn ich wirklich nur einen Befehl ausführen
will. Ich bekomme es aber nicht hin, wenn es mehrere Befehle sein
sollen, verknüpft durch ";" oder "&&".

Gibt es eine schöne Lösung?

Michael

Michael Schuerig
mailto:michael@schuerig.de
http://www.schuerig.de/michael/
 

Lesen sie die antworten

#1 Ansgar Strickerschmidt
13/09/2010 - 12:07 | Warnen spam
Also schrieb Michael Schuerig:

# foo_loop:
#!/bin/sh
find . -maxdepth 1 -type d -name 'foo_*' -print | while read dir ; do
( cd $dir && $* )
done

foo_loop "echo Ich arbeite jetzt in $1"

Das geht ganz ordentlich, wenn ich wirklich nur einen Befehl ausführen
will. Ich bekomme es aber nicht hin, wenn es mehrere Befehle sein
sollen, verknüpft durch ";" oder "&&".

Gibt es eine schöne Lösung?



Naja... ich finde es zumindest ungewöhnlich, einer Funktion Befehle als
Argumente mitzugeben, auch wenn das möglich ist.
Die Funktionalitàt sollte eigentlich schon im Skript-Code als solchem
stecken. Abgesehen davon, dass man sich da beliebige Probleme mit
ungeprüften Eingaben einhandeln kann, wenn man die unbesehen ausführt...
Ich persönlich würde zwischen zu verarbeitenden Daten und der dazu
benötigten Funktionalitàt strikt trennen...

Einen bekannten, begrenzten Satz an "Rezepten" (oder auch: Kombinationen
von Teilrezepten), die fallweise abzuarbeiten sind, würde ich mit einem
Parameter und einer "case"-Anweisung steuern.

Ansgar

*** Musik! ***

Ähnliche fragen