BASH zurück zur Hauptfunktion

7

Ich habe ein BASH-Skript, das eine Funktion aufruft, die andere Funktionen aufruft:

#!/bin/bash
function foo
{
    function bar
    {
        # do something
    }
    bar
}
foo

Wie kann ich bardirekt zur Hauptfunktion zurückkehren? Der Fall ist, dass barBenutzereingaben verarbeitet werden und wenn es eine negative Antwort erhält, muss es zur Hauptfunktion zurückkehren, andernfalls muss es zu zurückkehren foo.

Die Rückkehr zu fooist mit einer einfachen returnAnweisung kein Problem . Für den anderen habe ich Folgendes versucht (was tatsächlich funktioniert):

#!/bin/bash
function foo
{
    function bar
    {
        if [negative] # abstract statement
        then return 1
        else return 0
        fi
    }
    ! bar && return
}
foo

Aber gibt es eine Möglichkeit, die nur geändert werden muss, da ich Funktionen wie fooüber das gesamte Projekt verteilt habe ( bardie in einer Header-Datei definiert sind) bar? Das Projekt ist ~ 2k Zeilen lang und besteht aus mehreren Dateien. Auf diese Weise wäre es viel einfacher, wenn es eine Lösung gibt.

Psimon
quelle
Ich glaube nicht, dass das existiert. Dies wäre das Äquivalent von a goto, das meines Wissens in bash nicht existiert.
Polym
@polym Nein, BASH hat gotoleider keine .
Psimon

Antworten:

4

Es gibt keine gute Möglichkeit (mir ist bewusst), dies zu tun, aber wenn Sie bereit sind, den Preis zu zahlen ...

Anstatt den Code in Funktionen einzufügen, können Sie ihn in Dateien einfügen, die Sie als Quelle verwenden. Wenn die Funktionen Argumente benötigen, müssen Sie sie vorbereiten mit set:

set -- arg1 arg2 arg3
source ...

Drei Dateien:

  1. testscript.sh

    #! /bin/bash
    
    startdir="$PWD"
    
    echo mainscript
    
    while true; do
            echo "begin: helper loop"
            source "${startdir}/func_1"
            echo "end: helper loop"
            break
    done
    
    echo mainscript
    
  2. func_1

    echo "begin: func_1"
    source "${startdir}/func_2"
    echo "end: func_1"
    
  3. func_2

    echo "begin: func_2"
    echo break from func_2
    break 100
    echo "end: func_2"
    

Ergebnis:

> ./testscript.sh
mainscript
begin: helper loop
begin: func_1
begin: func_2
break from func_2
mainscript
Hauke ​​Laging
quelle
Scheint interessant ... Wenn ich es richtig verstanden habe, ist hier der wichtigste Punkt die Nutzung ist break 100die Rückkehr an den Anrufer, Schleife , nicht der Anrufer Funktion .
Psimon
1
@psimon Der Punkt ist, dass breakEbenen übersprungen werden können, während returndies nicht möglich ist.
Hauke ​​Laging