Le problème avec les autres réponses est qu'elles utilisent soit un global, qui peut être écrasé lorsque plusieurs fonctions sont dans une chaîne d'appel, soit echoque votre fonction ne peut pas générer d'informations de diagnostic (vous oublierez que votre fonction fait cela et le "résultat", c'est-à-dire retour valeur, contiendra plus d'informations que ce que votre appelant attend, ce qui conduit à un bug étrange), ou evalqui est beaucoup trop lourd et hacky.
La bonne façon de le faire est de placer les éléments de niveau supérieur dans une fonction et d'utiliser une localrègle de portée dynamique avec bash. Exemple:
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
Cette sorties
nothing
hi
bye
La portée dynamique signifie que cela ret_valpointe vers un objet différent selon l'appelant! Ceci est différent de la portée lexicale, qui est utilisée par la plupart des langages de programmation. Il s'agit en fait d' une fonctionnalité documentée , facile à manquer, et pas très bien expliquée, voici la documentation pour elle (c'est moi qui souligne):
Les variables locales à la fonction peuvent être déclarées avec le builtin local. Ces variables ne sont visibles que par la fonction et les commandes qu'elle appelle .
Pour quelqu'un avec un fond C / C ++ / Python / Java / C # / javascript, c'est probablement le plus grand obstacle: les fonctions en bash ne sont pas des fonctions, ce sont des commandes et se comportent comme telles: elles peuvent sortir vers stdout/ stderr, elles peuvent diriger / out, ils peuvent retourner un code de sortie. Fondamentalement, il n'y a aucune différence entre la définition d'une commande dans un script et la création d'un exécutable qui peut être appelé à partir de la ligne de commande.
Donc au lieu d'écrire votre script comme ceci:
top-level code
bunch of functions
more top-level code
écrivez-le comme ceci:
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
où main()déclare ret_valas localet toutes les autres fonctions renvoient des valeurs via ret_val.
Voir aussi la question Unix et Linux suivante: Portée des variables locales dans les fonctions shell .
Une autre solution, peut-être encore meilleure selon la situation, est celle publiée par ya.teck qui utilise local -n.
returndans votre cas est essentiellement le même que celuiexit codequi va de0 - 255. Utilisezechocomme suggéré par @septi. Les codes de sortie peuvent être capturés avec$?.