BASH retornar à função principal

7

Eu tenho um script BASH que chama uma função, que chama outras funções:

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

Como posso retornar de bar diretamente para a função principal? O caso é que bar manipula a entrada do usuário e, se receber uma resposta negativa, deve retornar à função principal, caso contrário, ela deve retornar para foo .

Retornar para foo não é um problema com uma instrução return simples. Para o outro, eu tentei isso (o que realmente funciona):

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

Mas como tenho funções como foo espalhadas por todo o projeto ( bar é definido em um arquivo de cabeçalho), existe uma maneira que requer apenas modificação para bar ? O projeto tem ~ 2k linhas de comprimento e consiste em vários arquivos, seria muito mais fácil se houvesse uma solução.

    
por psimon 30.06.2014 / 17:49

1 resposta

4

Não há uma maneira legal (estou ciente disso) de fazer isso, mas se você estiver disposto a pagar o preço ...

Em vez de colocar o código em funções, você pode colocá-lo nos arquivos de origem. Se as funções precisarem de argumentos, você deverá prepará-las com set :

set -- arg1 arg2 arg3
source ...

Três arquivos:

  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"
    

Resultado:

> ./testscript.sh
mainscript
begin: helper loop
begin: func_1
begin: func_2
break from func_2
mainscript
    
por 01.07.2014 / 00:23