Respostas:
Como outros já disseram, você não pode fazer isso.
Mas se você deseja organizar o código em um arquivo para que o programa principal fique na parte superior do arquivo e outras funções sejam definidas abaixo, você poderá fazê-lo tendo uma mainfunção 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 mainno final do arquivo, todas as funções já estão definidas. É necessário passar explicitamente "$@"para mainpara tornar os argumentos da linha de comandos do script visíveis na função.
O explícito exitna mesma linha que a chamada para main não é obrigatório, mas pode ser usado para impedir que um script em execução seja prejudicado se o arquivo de script for modificado. Sem ele, o shell tentaria continuar lendo os comandos do arquivo de script após mainretornos. (consulte Como ler o script de shell inteiro antes de executá-lo? )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"a função principal para chamar a fonte em outro script sem Mainser executada. Então eu posso reutilizar as funções ou escrever testes para verificá-las.
main "$@"; exit(com exita mesma linha que main) também é útil como proteção contra o arquivo sendo modificado enquanto é interpretado.
exita mesma linha para maingarantir que o shell não leia nada novamente do arquivo após o mainretorno.
main; exit, main; exit $?ou main <EOF>, em todos os casos o código de saída mainé usado como o código de saída do script. A exitseria apenas para evitar que as coisas ficar confuso se alguém edita o roteiro enquanto ele está funcionando.
Não, as funções precisam existir no ambiente de shells no momento de chamá-las.
O "Guia de estilos de shell" do Google tem uma correção para isso:
Uma função chamada
mainé necessária para scripts longos o suficiente para conter pelo menos uma outra função.
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 mainfunção com quaisquer parâmetros que o script foi fornecido. A mainfunçã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 chega à mainchamada, todas as funções no script foram analisadas e, portanto, podem ser chamadas de dentro da mainfunção.
Não, as funções precisam ser declaradas antes de serem usadas. Os scripts do shell são lidos linha a linha e atuados linha a linha; portanto, uma função não existe até que sua declaração seja executada.
Cque é confortável.
. yourfile).
ifinstruções simples fora de uma função. A função não precisa ser definida quando você declara a iffunção -contain, apenas quando a chama .
O shell não tem conceito de declaringfunção. Portanto, você não pode ter uma declaração direta.
Como conseqüência, você precisa que a implementação da função seja lida pelo shell antes de poder ser chamada.
autoload fdeclara a função, mas seu corpo é carregado apenas na primeira chamada). Isso não se aplica aos OPs bash.