Bash-Skript: Befehl wiederholen, wenn ein Fehler zurückgegeben wird

23

Ich möchte eine Schleife erstellen, die eine Ncftp-Übertragung wiederholt, wenn es einen Fehler zurückgibt.

Ich bin ein wenig unsicher, wie die Exit-Code-Variable in einer Schleife verwendet werden kann. Würde so etwas funktionieren?

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done
Roy
quelle
Siehe auch: Wie man den "curl" -Befehl automatisch
wiederholt,

Antworten:

40

Die Basis für diese elegante Schleife habe ich an anderer Stelle bei serverfault gefunden. Es hat sich herausgestellt, dass der Exit-Code nicht gespeichert werden muss, da Sie ihn direkt mit dem Befehl selbst testen können.

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done
Roy
quelle
8

Fast. Wahrscheinlich ist es besser, den Rückgabewert als Variable zu speichern, damit Sie ihn vor der Schleife voreinstellen können. Andernfalls wird es vom zuletzt ausgeführten Befehl beeinflusst.

Möglicherweise möchten Sie auch einen sleepin diese Position werfen, um zu verhindern, dass er zu schnell wieder auftaucht.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done
Dan Carley
quelle
Ich denke, ich habe vergessen, den Exit-Code an die RET-Variable zu übergeben, aber ich habe die Idee. Meine Hauptfrage ist, wann die until-Klausel ausgewertet wird. In C wird es erst nach dem ersten Durchlauf der Schleife ausgewertet. In diesem Fall sollte meine Schleife funktionieren. Ihre ist jedoch immer noch besser, da sie Zwischenbefehle wie den Schlaf zulässt. Vielen Dank!
Roy
Gut beobachtet. Ich habe es bearbeitet. Die Klausel wird vor dem ersten Lauf ausgewertet. Zuvor wurde also der Rückkehrcode eines vorhergehenden Befehls verwendet. Das Doppelgleiche wird von Bash nicht erzwungen, aber es ist eine gute Übung, es zu verwenden.
Dan Carley
== ist für die String-Gleichheit nicht numerisch, obwohl ich denke, dass es in diesem Fall nicht wichtig ist ...
Kyle Brandt
Einzel- und Doppelgleichheit sind gleich. Aber es wäre besser, jetzt, wo Sie es erwähnen, die Ganzzahlgleichung zu verwenden.
Dan Carley
1
Sie müssen die Rückgabecodenummer nicht testen - Sie können nur den Rückgabecode des Programms selbst testen - bis zum Programm. schlafe 3; getan .
Chris
3

Etwas verrückt, aber meine Lösung war, einfach eine Bash-Funktion zu erstellen, die sich selbst ausführt, wenn sie mit einem Fehler beendet wird

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry
Qwertie
quelle
0

Sie können eine Schleife ausführen, während Ihr Befehl einen Fehler zurückgibt:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;
Andrés Rivas
quelle
3
Diese Antwort muss erklärt werden.
Kasperd
@kasperd Erklärung hinzugefügt
Andrés Rivas