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 !

21
demandé sur John Kugelman 2013-03-27 23:53:01

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.

41
répondu John Kugelman 2013-03-27 19:55:06

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:

Quand la substitution de commande génère - t-elle plus de sous-shell que les mêmes commandes isolément?

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.

3
répondu markeissler 2017-10-20 20:15:49