J'ai une fonction qui renvoie 1 si le nombre est un nombre à dix chiffres valide:
valNum()
{
flag=1
if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
echo "Invalid Number"
flag=0
fi
return $flag
}
Il est appelé par:
if [[ $(valNum $num) -eq 1 ]]; then
#do something
fi
La fonction fonctionne correctement si le numéro est valide mais affiche une erreur de syntaxe si vous entrez un numéro non valide.
la source
if valnum "$num"
est équivalent àif valnum "$num" = 0
ie "si c'est vrai". La règle de base dans les scripts sh est que 0 = vrai / succès, non nul = faux / erreur.if [[ $(valNum $num) -eq 1 ]]
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.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: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.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, jamais1
.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:
$(valNum "$num")
la source
J'ai moi-même eu des résultats contradictoires dans ce domaine. Voici les résultats de mes expériences empiriques. Tout d'abord, une « théorie » sur les commandes bash ou * nix:
Exemple:
Production:
Comme indiqué, la
ls
commande renvoie le code d'état = 2. Lorsque vous essayez un répertoire valide, l'état est zéro ( 0 ). Pas le même que presque toutes les autres langues.règle # 1 - Faire ...
Nous devons nous rappeler que nous testons les codes d'erreur dans une
if
instruction Bash . J'ai mis en place des constantes, ou vous pouvez utiliser un shelltrue
ou desfalse
commandes.et sortie:
Cependant, je vous suggère de donner tout @ vote « up-vote » parce que sa réponse est la bonne. Je voulais juste avoir le côté simpliste sur ePaper.
Juste une autre chose, la
test
commande. Cela ressemble à ceci:La plupart du temps. Et par exemple:
Zéro (0) étant vrai . Pourquoi? Eh bien, la page de manuel indique qu'un seul argument est « vrai » lorsqu'il n'est PAS NUL.
références:
la source