Vous ne pouvez pas retourner un résultat arbitraire à partir d'une fonction shell. Vous ne pouvez renvoyer qu'un code d'état qui est un entier compris entre 0 et 255. (Bien que vous puissiez passer une valeur plus grande à return
, il est tronqué modulo 256.) La valeur doit être 0 pour indiquer le succès et une valeur différente pour indiquer l'échec; par convention, vous devez vous en tenir aux codes d'erreur entre 1 et 125, car les valeurs plus élevées ont une signification spéciale (mauvaise commande externe pour 126 et 127, tuée par un signal pour les valeurs plus élevées).
Étant donné que vous renvoyez un résultat oui ou non ici, un code d'état est approprié. Puisque flag
semble indiquer un succès ou un échec, vous devez utiliser les valeurs conventionnelles de 0 pour le succès et 1 pour l'échec (l'opposé de ce que vous avez écrit). Vous pouvez ensuite utiliser votre fonction directement dans une instruction if.
valNum ()
{
local flag=0
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo 1>&2 "Invalid Number"
flag=1
fi
return $flag
}
if valNum "$num"; then
#do something
fi
Si vous devez faire la distinction entre les codes de panne, appelez directement la fonction. Immédiatement après son retour, le code d'échec est disponible dans $?
. Vous pouvez ensuite le vérifier avec une déclaration de cas:
valNum "$num"
case $? in …
Si vous devez utiliser le code d'état ultérieurement, enregistrez-le dans une autre variable avant qu'il ne $?
soit remplacé par la commande suivante.
valNum "$num"
valNum_status=$?
Ce que vous avez écrit n'a pas fonctionné car la substitution de commande $(…)
s'étend à la sortie de la fonction, qui dans votre code est soit le message d'erreur, soit vide, jamais 1
.
Si vous avez besoin de transmettre plus d'informations qu'un code d'état ne permet de sortir d'un shell, vous avez deux possibilités:
- Imprimez du texte sur la sortie standard et appelez la fonction dans une substitution de commande:
$(valNum "$num")
- Attribuez à une ou plusieurs variables à l'intérieur de la fonction et lisez ces variables ultérieurement.