2016-08-10 1 views
-2

Wir haben keine goto Anweisung in bash, daher habe ich die folgende Funktion zu implementieren goto für abrupte Sprung in den Code.Was könnte der Ersatz sein, um die Flusskontrolle von gehen in SHELL Skript

Können wir diese Bedingung behandeln, ohne jumpto Funktion?

Auf der Basis der Lösung in this earlier answer to a related question Ich habe den folgenden Code:

#!/bin/bash 
    function jumpto 
    { 
     label=$1 
     cmd=$(sed -n "/$label:/{:a;n;p;ba};" $0 | grep -v ':$') 
     eval "$cmd" 
     exit 
    } 
    start="start" 
    jumpto $start 
start: 
while true 
do 
    for <condition> 
    do 
     #do something 
     for <condition> 
     do 
     if <condition> 
     then 
     break 99 
     fi 
     #do something 
     done 
    done 
done 
    #do something 
    #do something 
    #do manythings 
    if <condition> 
    then 
    #do something 
    jumpto start 
    else 
    #do something 
    fi 

    for <condition> 
    do 
    #do something 
    done 
+0

gibt es keine goto-Anweisung in bash. –

+0

ja ich weiß, das ist der Grund, warum ich es mit der Funktion jumpto implementiert habe, können wir es ohne jumpto-Funktion machen, indem wir irgendwelche Flusskontrollmethoden verwenden. –

+0

Anstelle von "-----" Kommentar verwenden, z. B .: "# tue etwas ..." Richtig den Code einrücken. – user3439894

Antwort

3

Anstatt zu versuchen, die Syntax der Shell zu erweitern

start: 

for ...; do 
    for ...; do 
     ... 
    done 
done 

if CONDITION; then 
    goto start 
else 
    SOMETHING 
fi 

zu tun Sie können

while true; do 
    for ...; do 
     for ...; do 
      ... 
     done 
    done 

    if ! CONDITION; then 
     SOMETHING 
     break 
    fi 
done 

oder

while true; do 
    for ...; do 
     for ...; do 
      ... 
     done 
    done 

    if ! CONDITION; then 
     break 
    fi 
done 

SOMETHING 

UPDATE: Neuer Code in Frage:

start: 
while true; do 
    for ...; do 
     for ...; do 
      if ...; then 
       break 99 
      fi 
      ... 
     done 
    done 
done 

... 

if CONDITION; then 
    SOMETHING 
    goto start 
else 
    SOMETHING_ELSE 
fi 

for ...; do 
    ... 
done 

einen GOTO zu vermeiden, kann dies in

while true; do 
    while true; do 
     for ...; do 
      for ...; do 
       if ...; then 
        break 99 # change to one less than 
           # the total depth, to not exit 
           # outermost loop 
       fi 
       ... 
      done 
     done 
    done 

    ... 

    if ! CONDITION; then 
     break 
    fi 

    SOMETHING 
done 

SOMETHING_ELSE 

for ...; do 
    ... 
done 
+0

@FarhanPatel Es sieht so aus, als ob Sie eine normale Funktion für diese doppelte Schleife verwenden möchten. – Kusalananda

+1

@FarhanPatel Ich denke, Sie müssen ein wenig über den allgemeinen Kontrollfluss Ihres Skripts nachdenken. – Kusalananda

+0

Es ist das gleiche, fügen Sie eine unendliche äußere Schleife hinzu. Brechen Sie auf '! Condition' daraus aus. Ändern Sie die 'break 99' (in Ihrem aktuellen Codebeispiel in der Frage) in eine normale' break'. – Kusalananda

0

umgewandelt werden Wenn Ihr Ziel ist einfach Ihr Skript von Anfang an neu zu starten , können Sie exec verwenden.

#!/bin/bash 

lots 
of 
code 
: 
if condition; then 
    exec "$0" "[email protected]" 
fi 

Sie könnten eine grobe Option implementieren, um das Etikett zu überspringen, wenn man nur dort.

#!/bin/bash 

if [ $1 = '--restart' ]; then 
    shift 
    # Skip everything in else clause 
else 
    lots 
    more 
    code 
    : 
fi 
# :start 
lots 
of 
code 
still 
: 
if condition; then 
    exec "$0" --restart "[email protected]" 
fi 
+0

, die möglicherweise nicht Start des Skripts, Skript hat viele Zeilen vor while-Schleife. –

+0

Wenn ein einzelnes Label in diesem Szenario angezeigt werden soll, ist dies möglicherweise eine praktikable Lösung. Siehe aktualisierte Antwort. – tripleee

Verwandte Themen