if instruction et fonction d'appel dans Si vous utilisez bash
J'ai une fonction écrite
check_log(){
if [ -f "/usr/apps/appcheck.log" ]
then
return 1
else
return 0
fi
}
Alors j'appelle cette fonction dans la condition if
if [ check_log ];
then
........statements....
fi
Cela fonctionnera-t-il ? Je suis confus ici parce que bash retourne 0 sur le succès et 1 sur l'échec. Mais ma fonction renvoie 1 et la condition vérifie 1/0, elle obtient 1 et elle devrait donner des échecs, mais dans mon script shell, la condition passe.
Quelqu'un Peut-il à travers une lumière sur cette question ?
Merci !
2 réponses
if [ check_log ];
Lorsque vous utilisez des crochets, vous appelez la commande test
. C'est équivalent à if test check_log
qui est un raccourci pour if test -n check_log
, ce qui signifie à son tour "si "check_log"
n'est pas une chaîne vide". Il n'appelle pas du tout votre fonction check_log
.
Changez-le en ceci:
if check_log;
En passant, la fonction pourrait être plus simplement écrite comme:
check_log() {
! [ -f "/usr/apps/appcheck.log" ]
}
La valeur de retour d'une fonction est l'état de sortie de la dernière commande, donc pas besoin d'instructions de retour explicites.
Comme noté par @john-kugelman, une solution (et peut-être la plus correcte) est d'utiliser la syntaxe suivante:
if check_log;
Mais une solution alternative est:
if [[ $(check_log; echo $?) -eq 0 ]];
Ma préférence personnelle est celle-ci car elle favorise la cohérence entre les déclarations conditionnelles. Mais l'inconvénient est que parce qu'il repose sur la substitution de commande, il va fork un processus enfant (c'est-à-dire un sous-shell) où comme la première méthode ne le fera pas.
Une lecture intéressante sur le sujet peut être trouvée ici:
Mise à jour (2017-10-20): pour supprimer ma préférence pour la deuxième méthode car ces jours-ci, je suis en mission pour éviter les forkages inutiles. La syntaxe de la première solution n'est pas aussi intuitive pour la programmation non-shell, mais elle est certainement plus efficace.