chamar a função declarada abaixo

10

É possível chamar uma função que é declarada abaixo no bash?

Exemplo

if [ "$input" = "yes" ]; then
    YES_FUNCTION
elif [ "$input" = "no" ]; then
    NO_FUNCTION
else
    exit 0;
fi

YES_FUNCTION()
{
  .....
  .....
}

NO_FUNCTION()
{
  .....
  .....
}
    
por msp9011 13.06.2018 / 12:15

4 respostas

29

Como outros disseram, você não pode fazer isso.

Mas se você quiser organizar o código em um arquivo para que o programa principal esteja no topo do arquivo e outras funções sejam definidas abaixo, você pode fazê-lo com uma função main separada.

Por exemplo

#!/bin/sh

main() {
    if [ "$1" = yes ]; then
        do_task_this
    else
        do_task_that
    fi
}

do_task_this() {
    ...
} 
do_task_that() {
    ...
} 

main "$@"; exit

Quando chamamos main no final do arquivo, todas as funções já estão definidas. A passagem explícita de "$@" para main é necessária para tornar visíveis os argumentos da linha de comando do script na função.

O exit explícito na mesma linha que a chamada para main não é obrigatório, mas pode ser usado para impedir que um script em execução fique confuso se o arquivo de script for modificado. Sem ele, o shell tentaria continuar lendo os comandos do arquivo de script após main retornar. (veja Como ler o script de shell inteiro antes de executá-lo? )

    
por 13.06.2018 / 12:44
9

Não, as funções precisam ser declaradas antes de serem usadas. Scripts shell são lidos linha por linha e atuados linha por linha; então uma função não existe até que sua declaração tenha sido executada.

    
por 13.06.2018 / 12:16
9

Não, as funções precisam existir no ambiente de shells no momento de chamá-las.

O "Guia de estilo da Shell" do Google tem uma correção para isso:

A function called main is required for scripts long enough to contain at least one other function.

No final do script, depois de todas as funções, como a única instrução que não está em uma função, você teria

main "$@"

Isso chamaria a função main com os parâmetros que o script recebeu. A função main pode estar localizada na parte superior do script (o guia de estilo diz para colocá-lo na parte inferior, mas, novamente, diz muitas coisas).

Quando o shell chega à chamada main , todas as funções no script foram analisadas e, portanto, podem ser chamadas a partir da função main .

    
por 13.06.2018 / 12:45
3

O shell não tem noção de declaring de uma função. Então você não pode ter uma declaração para frente.

Como conseqüência, você precisa ter a implementação da função lida pelo shell antes de poder ser chamada.

    
por 13.06.2018 / 12:18