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 echosignifica 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 evalmuito pesados e invasivos.
A maneira correta de fazer isso é colocar as coisas de nível superior em uma função e usar uma localregra 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_valaponta 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_valcomo locale 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.
returnno seu caso, é essencialmente o mesmoexit codeque o intervalo0 - 255. Useechocomo sugerido por @septi. Os códigos de saída podem ser capturados com$?.