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 echo
que 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 eval
qui 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 local
rè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_val
pointe 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_val
as local
et 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
.
return
dans votre cas est essentiellement le même que celuiexit code
qui va de0 - 255
. Utilisezecho
comme suggéré par @septi. Les codes de sortie peuvent être capturés avec$?
.