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 semMain
ser executada. Então eu posso reutilizar as funções ou escrever testes para verificá-las.main "$@"; exit
(comexit
a mesma linha quemain
) também é útil como proteção contra o arquivo sendo modificado enquanto é interpretado.exit
a mesma linha paramain
garantir que o shell não leia nada novamente do arquivo após omain
retorno.main; exit
,main; exit $?
oumain <EOF>
, em todos os casos o código de saídamain
é usado como o código de saída do script. Aexit
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:
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 foi fornecido. 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 chega à
main
chamada, todas as funções no script foram analisadas e, portanto, podem ser chamadas de dentro damain
função.fonte
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.
fonte
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 aif
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.
fonte
autoload f
declara a função, mas seu corpo é carregado apenas na primeira chamada). Isso não se aplica aos OPsbash
.