O problema com outras respostas é que eles usam um global, que pode ser sobrescrito quando várias funções estão em uma cadeia de chamadas ou echo
significa que sua função não pode gerar informações de diagnóstico (você esquecerá que sua função faz isso e o "resultado", ou seja, retorna valor, conterá mais informações do que o chamador espera, levando a erros estranhos) ou eval
muito pesados e invasivos.
A maneira correta de fazer isso é colocar as coisas de nível superior em uma função e usar uma local
regra de escopo dinâmico do bash. Exemplo:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
Isso gera
nothing
hi
bye
O escopo dinâmico significa que ret_val
aponta para um objeto diferente, dependendo do chamador! Isso é diferente do escopo lexical, que é o que a maioria das linguagens de programação usa. Este é realmente um recurso documentado , fácil de perder, e não muito bem explicado, eis a documentação para ele (a ênfase é minha):
Variáveis locais para a função podem ser declaradas com o local embutido. Essas variáveis são visíveis apenas para a função e os comandos que ela chama .
Para alguém com experiência em C / C ++ / Python / Java / C # / javascript, este é provavelmente o maior obstáculo: as funções no bash não são funções, são comandos e se comportam como tal: podem gerar saída para stdout
/ stderr
, podem canalizar / out, eles podem retornar um código de saída. Basicamente, não há diferença entre definir um comando em um script e criar um executável que possa ser chamado a partir da linha de comando.
Então, em vez de escrever seu script assim:
top-level code
bunch of functions
more top-level code
escreva assim:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
onde main()
declara ret_val
como local
e todas as outras funções retornam valores via ret_val
.
Veja também a seguinte pergunta sobre Unix e Linux: Escopo de variáveis locais nas funções do shell .
Outra solução, talvez ainda melhor, dependendo da situação, é a postada pelo ya.teck que utiliza local -n
.
return
no seu caso, é essencialmente o mesmoexit code
que o intervalo0 - 255
. Useecho
como sugerido por @septi. Os códigos de saída podem ser capturados com$?
.