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 main
funçã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 main
no final do arquivo, todas as funções já estão definidas. É necessário passar explicitamente "$@"
para main
para tornar os argumentos da linha de comandos 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 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 main
retornos. (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 Main
ser executada. Então eu posso reutilizar as funções ou escrever testes para verificá-las.
main "$@"; exit
(com exit
a mesma linha que main
) também é útil como proteção contra o arquivo sendo modificado enquanto é interpretado.
exit
a mesma linha para main
garantir que o shell não leia nada novamente do arquivo após o main
retorno.
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 exit
seria 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 main
função com quaisquer parâmetros que o script foi fornecido. A main
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 chega à main
chamada, todas as funções no script foram analisadas e, portanto, podem ser chamadas de dentro da main
funçã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.
C
que é confortável.
. yourfile
).
if
instruções simples fora de uma função. A função não precisa ser definida quando você declara a if
função -contain, apenas quando a chama .
O shell não tem conceito de declaring
funçã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 f
declara a função, mas seu corpo é carregado apenas na primeira chamada). Isso não se aplica aos OPs bash
.