Problem mit Rekursion in Bash / Funktioniert das überhaupt?

Diskutiere Problem mit Rekursion in Bash / Funktioniert das überhaupt? im Shell-Skripte Forum im Bereich Programmieren unter Linux/Unix; Hallo Allerseits, ich versuche gerade ein kleines Shell skript zu schreiben, welches bei einem gegebenen Verzeichnis alle darunter liegenden...

  1. sramko

    sramko Grünschnabel

    Dabei seit:
    21.09.2009
    Beiträge:
    2
    Zustimmungen:
    0
    Hallo Allerseits,

    ich versuche gerade ein kleines Shell skript zu schreiben, welches bei einem gegebenen Verzeichnis alle darunter liegenden Dateien und Ordner durchläuft und ein paar Informationen ausspuckt. Allerdings gibt es zwei bedingungen:
    1. Es müssen zunächst die Dateien eines Ordners und erst danach die Unterordner behandelt werden
    2. Alles muss in alphabetischer Reihenfolge durchlaufen werden.

    Nach einigen Versuchen, WebSearch und ManPages lesen kam ich zu dem Ergebiss, dass "find" diese Aufgabe nicht bewältigen kann.
    hier mein ansatz als bash-Script:
    Code:
    iteration()  
    {
        echo $1 $2;
        local dr=$1;
        local i=;
        local j=;
        local nr=$2;
        
        for i in $(ls -1 -q "$dr") ; do 
    	if test -f $i ; then
    	    echo f\;$nr\;$i\;$dr/$i ;
    	fi
        done;
        
        for j in $(ls -1 -q "$dr") ; do 
    	if test -d $j ; then
    	    echo d\;$nr\;$j\;$dr/$j ;
    	    iteration  $dr/$j $[$nr+1]; #hier ist das Problem
    	fi
        done;   
    }
    
    Der erste durchlauf klappt super. Aber die Iterration klappt nicht. Wie ihr seht, hab ich es mit "local" Variablen versucht, ohne genaues Wissen darüber, wie das in Bash funktioniert. In Java, Perl, Python, PHP,.... würde der Code ja prima funktionieren, aber unter Bash bekomme ich ihn nicht zum laufen.

    Nun die Frage: kann mir jemand ein Beispiel für rekursieve Bash-Programmierung schicken oder mir zumidest zu verstehen geben, dass Rekursion in Bash nicht funktioniert?

    Danke,

    Lyrik
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 bytepool, 21.09.2009
    Zuletzt bearbeitet: 21.09.2009
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    Rekursion funktioniert prima, hab ich zum Spass grad mal getestet indem ich die fibonacci sequence rekursiv in der bash geschrieben hab. ;)

    Was ist denn die Fehlermeldung? Edit: Und der erste Aufruf waere ja vielleicht auch interessant.

    Edit2:
    Ah, habe gerade ein wenig mit deinem Code rumgespielt, die Tests sind das Problem. Du fuehrst die Tests im falschen Ordner aus, bzw. musst noch den Pfad davor stellen. Hier mal eine leicht angepasste Version deines Skripts:

    Code:
    iteration()
    {
        echo $1 $2
        dr=$1
        nr=$2
    
        for i in $(ls -1 -q "$dr"); do
            if [ -f $dr/$i ]; then
                echo "f;$nr;$i;$dr/$i"
            fi
        done
    
        for j in $(ls -1 -q "$dr"); do
            if [ -d $dr/$j ]; then
                echo "d;$nr;$j;$dr/$j"
                newdir="$dr/$j"
                newnr=$((nr + 1))
                iteration $newdir $newnr
            fi
        done
    }
    
    mfg,
    bytepool
     
  4. #3 sramko, 21.09.2009
    Zuletzt bearbeitet: 21.09.2009
    sramko

    sramko Grünschnabel

    Dabei seit:
    21.09.2009
    Beiträge:
    2
    Zustimmungen:
    0
    Fehler gefunden: ich hab jeweils in der if-Abfrage versäumt, den gesamten Pfad mit anzugeben.

    Wer's braut: hier nochmal der korrigierte Code

    Code:
    iteration()  
    {
        #echo $1 $2;
        local dr=$1;
        local i=;
        local j=;
        local nr=$2;
        
        #echo dr $dr, nr $nr,
        for i in $(ls -1 -q "$dr") ; do 
    	if test -f "$dr/$i" ; then
    	#    echo f
    	    echo f\;$nr\;$i\;$dr/$i ;
    	fi
        done;
        
        for j in $(ls -1 -q "$dr") ; do 
    	if test -d "$dr/$j" ; then
    	 #   echo d
    	    echo d\;$nr\;$j\;$dr/$j ;
    	    iteration  "$dr/$j" $[$nr+1];
    	fi
        done;   
    }
    
    
    iteration $(pwd)
    
     
Thema:

Problem mit Rekursion in Bash / Funktioniert das überhaupt?

Die Seite wird geladen...

Problem mit Rekursion in Bash / Funktioniert das überhaupt? - Ähnliche Themen

  1. Netzwerkproblem ? , wo ud wie suchen

    Netzwerkproblem ? , wo ud wie suchen: Hallo Folgende Problem: Testserver ist i686 Debian-unstable , auf dem läuft primär der apt-proxy apt-cahcer ng. Zugriff im Moment nur per ssh....
  2. Verständnisproblem Samba / LDAP

    Verständnisproblem Samba / LDAP: Hallo zusammen! Ich habe unter Ubuntu 16.04 einen LDAP und Samba Server aufgesetzt. Diese scheinen auch ordnungsgemäß zu funktionieren, sodaß ich...
  3. nginx+php-fpm problem

    nginx+php-fpm problem: Moin, ich hab hier gerade ein Problem und keine Idee mehr woran es liegt. Ich muss wie schon in der Überschrift erwähnt nginx dazu bringen php...
  4. Problem mit Windows auf Ordner auf dem Linuxsystem zuzugreifen

    Problem mit Windows auf Ordner auf dem Linuxsystem zuzugreifen: Ich mache gerade meine ersten Schritte mit Linux und würde gerne auf Dateien meines Linuxsystems auch mit Windows zugreifen, ich bin am...
  5. Virtualboxproblem

    Virtualboxproblem: Hallo Folgnedes Problem: Ich kann ohne Probleme In Debian-Sid, 64Bit und virtualbox-dkms Unixoide installieren, wenn es sich um eine...