在 SHELL 脚本中可以用什么来处理 go-to 的流程控制

What could be the substitute to handle the flow control of go-to in SHELL script

我们在bash中没有任何goto语句,因此我使用下面的函数来实现goto代码中的突然跳转。

我们可以不使用 jumpto 函数来处理这种情况吗?

基于this earlier answer to a related question中的解决方案,我有以下代码:

 #!/bin/bash
    function jumpto
    {
        label=
        cmd=$(sed -n "/$label:/{:a;n;p;ba};" [=11=] | 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

而不是尝试扩展 shell 的语法来做

start:

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

if CONDITION; then
    goto start
else
    SOMETHING
fi

你可以

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

    if ! CONDITION; then
        SOMETHING
        break
    fi
done

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

    if ! CONDITION; then
        break
    fi
done

SOMETHING

更新:有问题的新代码:

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

为了避免跳转,这可能会变成

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

如果您的目标只是从头开始重新启动脚本,您可以使用 exec

#!/bin/bash

lots
of
code
:
if condition; then
  exec "[=10=]" "$@"
fi

如果只有一个标签,您可以实施一个粗略的选项来跳转到标签。

#!/bin/bash

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