while loop - ich blicks nicht

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von karloff, 07.06.2012.

  1. #1 karloff, 07.06.2012
    karloff

    karloff Routinier

    Dabei seit:
    09.07.2007
    Beiträge:
    317
    Zustimmungen:
    0
    Ort:
    ~/
    Moin ich hab da irgendwie ein Problem,
    ich raffs nicht so ganz was da falsch läuft.
    Vielleicht kann mir einer von euch kurz sagen was da falsch läuft.


    Hab das ganze Problem mal isoliert.
    Code:
    #!/bin/bash
    while [ 'echo $?' != 0 ];
    do
    find /tmp/bla/ -type d -empty -exec rmdir {} \; #2&>/dev/null
    echo $?
    done
    
    Wenn ich das script starte läuft alles wie es soll, er löscht alle leeren ordner und gibt mir solange es noch welche gibt 1 zurück wenn keine mehr da sind gibt er null zurück macht dann aber endlos weiter.

    Das ganze sieht dann so aus

    Code:
    scripts/while_bash_return_0.sh 
    find: `/tmp/bla/bla/bla/bla/bla/bla/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla/bla/bla/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla/bla/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla/bla': No such file or directory
    1
    find: `/tmp/bla/bla': No such file or directory
    1
    0
    0
    0
    0
    0
    0
    0
    0
    0
    usw.
    
    Also hab ich irgendwie wohl den while befehl verkackt, nur find ich den Fehler nicht.
    Bitte um Sachdienliche Hinweise :)

    Danke
     
  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 T-Virus, 07.06.2012
    T-Virus

    T-Virus Free Software Fan :p

    Dabei seit:
    06.01.2009
    Beiträge:
    107
    Zustimmungen:
    0
    Kurz gegooglet.

    Versuchs mit -ne 0 anstelle von != 0.
    != 0 bezieht sich auf String vergleiche :)
    Ist auch für mich immer schwer zu merken.
    Programmierer denken eben mit != anstelle von eq/ne

    T-Virus
     
  4. #3 karloff, 07.06.2012
    karloff

    karloff Routinier

    Dabei seit:
    09.07.2007
    Beiträge:
    317
    Zustimmungen:
    0
    Ort:
    ~/
    Moin,

    danke erstmal, gebracht hats leider nicht wirklich was (abgesehen von der Erkenntnis das es sowas auch gibt).
    while [ 'echo $?' -ne 0 ];
    liefert jetzt allerdings => integer expression expected

    Bringt mich leider auch nicht wirklich weiter.
     
  5. #4 tgruene, 07.06.2012
    tgruene

    tgruene Routinier

    Dabei seit:
    02.02.2012
    Beiträge:
    418
    Zustimmungen:
    0
    Ersetze mal
    Code:
    while [ 'echo $?' -ne 0 ];
    mal mit
    Code:
    while [ $(echo $?) -ne 0 ];
    . Mit Hochkomma bekomme ich dieselbe Fehlermeldung, mit der Klammer nicht.
     
  6. #5 Spröde, 07.06.2012
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    $? enthält den Returncode des letzten Befehls. In Deinem Fall also des Befehls "echo $?". Das willst Du nicht wirklich - oder? Speichere den Returncode des Befehls "find" also in einer Variablen und lasse die in der Schleifenbedingung auswerten. Tipp:
    Code:
    while (($Result)); do ...
    läuft, solange $Result ungleich Null ist.
     
  7. #6 karloff, 09.06.2012
    karloff

    karloff Routinier

    Dabei seit:
    09.07.2007
    Beiträge:
    317
    Zustimmungen:
    0
    Ort:
    ~/
    Besten Dank für dein Denkanstoß @Spröde
    Jetzt läufts wie gewünscht.

    Code:
    #!/bin/bash
    while [ "${RESULT}" != 0 ];
    do
    find /tmp/bla/ -type d -empty -exec rmdir {} \; #2&>/dev/null
    RESULT=`echo $?`
    done
    
     
  8. #7 Spröde, 09.06.2012
    Zuletzt bearbeitet: 09.06.2012
    Spröde

    Spröde Alter Sack

    Dabei seit:
    22.01.2012
    Beiträge:
    173
    Zustimmungen:
    0
    Ich will Dir nicht zu Nahe treten, aber ich habe nur selten einen so krummen Code gesehen, wie Deinen. Wenn er aber einfach nur ein Mal laufen soll, vergiss dieses Posting.
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 floyd62, 09.06.2012
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    nur aus Neugier: geht es dir hauptächlich um die while-Loop, oder willst du nur alle leeren Verzeichnisse unterhalb von /tmp/bla löschen? Das ginge nämlich einfacher mit
    Code:
    find /tmp/bla -depth -mindepth 1 -type d -empty -print -exec rmdir {} \;
    
    In deiner letzten Version fallen mir noch ein paar Kleinigkeiten auf: zum einen kannst du die RESULT-Variable auch einfach mit
    Code:
    RESULT=$?
    
    setzen, der echo-Befehl ist also überflüssig. Zum anderen läuft dein Skript wahrscheinlich wieder in eine Endlosschleife, wenn ausser leeren Directories nichts unter /tmp/bla liegt: in dem Fall wird /tmp/bla gelöscht, und beim nächsten Aufruf gibt es das Ding nicht mehr, so dass find das Startverzeichnis nicht findet, und auch wieder Exit-Status 1 liefert.

    Das Hauptproblem beim ursprünglichen Ansatz (find mit Standardsuche, ohne -depth) ist ja, dass find zunächst das Verzeichnis löscht, und dann erst versucht, dort hinein zu wechseln. Deswegen bekommst du ja auch die "No such file or directory"-Meldungen ... mit -depth kannst du das umgehen, und dann terminiert find auch sauber mit Status 0.

    Gruss, A.
     
  11. #9 karloff, 12.06.2012
    karloff

    karloff Routinier

    Dabei seit:
    09.07.2007
    Beiträge:
    317
    Zustimmungen:
    0
    Ort:
    ~/
    Danke für die Statments

    Es ging in diesem spezielen Fall um beides, weil zum einen gut zu wissen wie man ein while mit dem return wert hinbekommt zum anderen hätte ich auch mal die manpage von find genauer lesen können...
     
Thema:

while loop - ich blicks nicht

Die Seite wird geladen...

while loop - ich blicks nicht - Ähnliche Themen

  1. do-while Schleife

    do-while Schleife: Hi, Ich sehe bei Bash immer nur: while [ Bedingung ]; do Aktion done Gibt es auch eine umgekehrte Schleife? Also do...
  2. while

    while: Ich hoffe jetzt mal das die Frage noch nicht gestellt wurde! Wieso funzt das nicht? Es ist eine einfache ja nein frage, bei der verhindert werden...
  3. while [ 1 = 1 ] ...Anfängerfrage

    while [ 1 = 1 ] ...Anfängerfrage: Hi, Warum gibt: while [ 1 = 1 ] ; do echo -n '.' && sleep 1 ; done ..mal einen und mal zwei Punkte auf einmal aus? Müsste es nicht immer nur...
  4. Expect - Fehler in While

    Expect - Fehler in While: Hi, versuche mich gerade mit Expect und bin dabei, ein File zeilenweise auszulesen, wobei das erste Argument ein Host und das zweite ein...
  5. error while loading shared libraries: libstdc++.so.6: cannot open shared object file:

    error while loading shared libraries: libstdc++.so.6: cannot open shared object file:: Hallo, Ich habe hiermit gerade ein Problem: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file...