É possível chamar uma função 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()
{
.....
.....
}
É possível chamar uma função 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()
{
.....
.....
}
Como outros já disseram, você não pode fazer isso.
Mas se você quiser organizar o código em um arquivo para que o programa principal fique no topo do arquivo e outras funções sejam definidas abaixo, você pode fazer isso com uma
main
função separada.Por exemplo
Quando chamamos
main
no final do arquivo, todas as funções já estão definidas. A passagem explícita"$@"
paramain
é necessária para tornar os argumentos de linha de comando do script visíveis na função.O explícito
exit
na mesma linha que a chamada para main não é obrigatório, mas pode ser usado para evitar 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 osmain
retornos. (veja Como ler todo o script de shell antes de executá-lo? )Não, as funções precisam existir no ambiente shells no momento de chamá-las.
O "Shell Style Guide" do Google tem uma correção para isso:
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
Isso chamaria a
main
função com quaisquer parâmetros que o script tenha recebido. Amain
função pode estar localizada na parte superior do script (o guia de estilo diz para colocá-la na parte inferior, mas, novamente, diz muitas coisas).Quando o shell recebe a
main
chamada, todas as funções no script foram analisadas e, portanto, podem ser chamadas de dentro damain
função.Não, as funções precisam ser declaradas antes de serem usadas. Os scripts de shell são lidos linha por linha e executados linha por linha; então uma função não existe até que sua declaração seja executada.
O shell não tem conceito de
declaring
função. Portanto, você não pode ter uma declaração de encaminhamento.Como consequência, você precisa ter a implementação da função lida pelo shell antes que ela possa ser chamada.