Christian Boltz wrote:
Hallo David, hallo Thomas, hallo Leute,
Am Montag, 14. November 2005 06:44 schrieb David Haller:
Am Fri, 11 Nov 2005, Thomas Moritz schrieb:
case "`wget -c $woher -O $wohin`$?" in 0) echo "hat geklappt"; echo "machnochwas";; 0) echo "hat geklappt"; echo "machnochwas";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$?";; esac
*HUCH*[tm]!!!! Dascha ein Konstrukt, dass ich noch gar nicht kenne!
Ich würde es auch nicht empfehlen. Grund: es schlägt fehl, sobald das aufgerufene Programm irgendwas auf stdout schreibt.
Hier ein (zugegebenermaßen offensichtliches) Beispiel:
case "`echo foo`$?" in 0) echo "hat geklappt"; ;; 1) echo "ging schief"; ;; *) echo "irgendwas: $?"; ;; esac
Ergebnis: "irgendwas: 0" (ja, die 0 ist wirklich noch der Exitcode vom echo-Befehl. Wer es nicht glaubt, probiert es mit "echo foo ; false" statt nur echo ;-)
Besser, weil nicht anfällig gegen stdout:
echo foo ; case $? in [Rest wie oben]
Gruß
Christian Boltz
Hallo Christian, David und alle, die es interessiert! Christian, Du hast zwar recht damit, daß es nicht funktioniert, obwohl ich erst nicht damit übereinstimmte, aber der Grund ist ein anderer und es macht auch keinen Unterschied, ob das Programm etwas auf stdout schreibt oder nicht. Der Exitcode eines Programmes steht nur UNMITTELBAR NACH dem Kommando zur Verfügung. Es darf kein weiteres Kommando ausgeführt werden, welches einen Exitcode liefert, sonst kann für nichts garantiert werden (also selbst dann, wenn das folgende Kommando noch gar nicht fertig ist). Das bringt uns aber auch schon zur Lösung der Geschichte, denn der EINZIGE VERLÄSSLICH FUNKTIONIERENDE Weg für einen solchen Fall ist folgender: wget -c $woher -O $wohin RC=$? case $RC in 0) echo "hat geklappt"; echo "machnochwas";; 0) echo "Und dieser Casefall wird überhaupt nicht mehr ausgeführt"; echo "da der Fall 0 bereits abgearbeitet ist ...";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$RC";; esac Tjou, dann viel Spaß Martin P.S. ich habe noch ein kleines Skript angehängt, welches obiges einigermaßen nachvollziehbar demonstriert, wie ich meine: clear; echo testFile >testFile test -f testFile || ( echo "Konnte Datei 'testFile' nicht erstellen"; exit 1 ) echo "Type 1: false, true" tar H 2>/dev/null case `tar cvf testFile.tar testFile` in 0) echo "hat geklappt"; echo "machnochwas";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$?";; esac echo echo "Type 2: true, false" tar cvf testFile.tar testFile case `tar H 2>/dev/null` in 0) echo "hat geklappt"; echo "machnochwas";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$?";; esac echo echo "Type 3: false, true" tar H case `tar cvf testFile.tar testFile` in 0) echo "hat geklappt"; echo "machnochwas";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$?";; esac echo echo "Type 4: true, false" tar cvf testFile.tar testFile case `tar H` in 0) echo "hat geklappt"; echo "machnochwas";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$?";; esac echo echo "Type 5: true, irrelevant" true RC=$? case $RC in 0) echo "hat geklappt"; echo "machnochwas";; 0) echo "Und dies wird überhaupt nicht mehr ausgeführt, da der Fall 0 bereits abgearbeitet ist ...";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$RC";; esac echo echo "Type 6: false, irrelevant" false RC=$? case $RC in 0) echo "hat geklappt"; echo "machnochwas";; 0) echo "Und dies wird überhaupt nicht mehr ausgeführt, da der Fall 0 bereits abgearbeitet ist ...";; 1) echo "ging schief"; echo "machs nochmal";; *) echo "Ende mit Fehlercode=$RC";; esac