Es gibt keine goto
in Bash.
Hier ist eine schmutzige Problemumgehung, mit trap
der nur rückwärts gesprungen wird :)
#!/bin/bash -e
trap '
echo I am
sleep 1
echo here now.
' EXIT
echo foo
goto trap 2> /dev/null
echo bar
Ausgabe:
$ ./test.sh
foo
I am
here now.
Dies sollte nicht auf diese Weise verwendet werden, sondern nur zu Bildungszwecken. Hier ist, warum dies funktioniert:
trap
verwendet die Ausnahmebehandlung, um die Änderung des Codeflusses zu erreichen. In diesem Fall trap
fängt das alles ab, was dazu führt, dass das Skript beendet wird. Der Befehl goto
existiert nicht und löst daher einen Fehler aus, der normalerweise das Skript beendet. Dieser Fehler wird abgefangen trap
und 2>/dev/null
verbirgt die Fehlermeldung, die normalerweise angezeigt wird.
Diese Implementierung von goto ist offensichtlich nicht zuverlässig, da jeder nicht vorhandene Befehl (oder jeder andere Fehler auf diese Weise) denselben Trap-Befehl ausführen würde. Insbesondere können Sie nicht auswählen, zu welchem Etikett Sie wechseln möchten.
Grundsätzlich benötigen Sie im realen Szenario keine goto-Anweisungen, sie sind redundant, da zufällige Aufrufe an verschiedene Stellen Ihren Code nur schwer verständlich machen.
Wenn Ihr Code mehrmals aufgerufen wird, sollten Sie die Schleife verwenden und den Workflow ändern, um continue
und zu verwenden break
.
Wenn sich Ihr Code selbst wiederholt, sollten Sie die Funktion schreiben und so oft aufrufen, wie Sie möchten.
Wenn Ihr Code basierend auf dem Variablenwert in einen bestimmten Abschnitt springen muss, sollten Sie die Verwendung einer case
Anweisung in Betracht ziehen .
Wenn Sie Ihren langen Code in kleinere Teile aufteilen können, sollten Sie ihn in separate Dateien verschieben und über das übergeordnete Skript aufrufen.
goto
Bash (zumindest steht escommand not found
für mich). Warum? Wahrscheinlich gibt es einen besseren Weg, dies zu tun.