Es gibt keine gotoin Bash.
Hier ist eine schmutzige Problemumgehung, mit trapder 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:
trapverwendet die Ausnahmebehandlung, um die Änderung des Codeflusses zu erreichen. In diesem Fall trapfängt das alles ab, was dazu führt, dass das Skript beendet wird. Der Befehl gotoexistiert nicht und löst daher einen Fehler aus, der normalerweise das Skript beendet. Dieser Fehler wird abgefangen trapund 2>/dev/nullverbirgt 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 continueund 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 caseAnweisung 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.
gotoBash (zumindest steht escommand not foundfür mich). Warum? Wahrscheinlich gibt es einen besseren Weg, dies zu tun.