while loop - ich blicks nicht

karloff

karloff

Routinier
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
 
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
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

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
 
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.
 
Ersetze mal
Code:
while [ 'echo $?' -ne 0 ];
mal mit
Code:
while [ $(echo $?) -ne 0 ];
. Mit Hochkomma bekomme ich dieselbe Fehlermeldung, mit der Klammer nicht.
 
$? 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.
 
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
 
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.
 
Zuletzt bearbeitet:
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.
 
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...
 

Ähnliche Themen

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Keine grafische Oberfläche (Debian Installation)

CentOS 6 to 7 Upgrade

HandbrakeCLI Shell Skript

Shell Skript beschleunigen

Zurück
Oben