Aller au contenu

Programmation Bash/Structures conditionnelles

Un livre de Wikilivres.

L'instruction if permet d'effectuer des opérations si une condition est réalisée.

if condition
then 
    instruction(s)
fi

Dans ce cas condition est une commande et l'expression conditionelle est exécutée si son code de retour vaut zéro. Par exemple

if pkg-config gtk+-2.0
then
    echo "gtk+ est installé sur votre système"
fi

exécute le programme pkg-config avec le paramètre gtk+-2.0 et exécute echo "gtk+ est installé sur votre système" si la valeur de retour de pkg-config est zéro. Il est bien sur possible d'utiliser des enchainements de commandes, ainsi :

if pkg-config gtk+-2.0 && pkg-config gtkglext-1.0
then
    echo "gtk+ et gtkglext sont installés sur votre système"
fi

n'affichera quelque chose que si les deux appels à pkg-config ont un code de retour à 0.

Comme vu précédemment, test et [ renvoient un code égal à zéro si une condition est vraie et différent de zéro sinon, il est donc possible de les utiliser avec une instrution if :

if [ "$mavariable" = "unevaleur" ]
then
    echo "ma variable a la bonne valeur"
fi

L'instruction if peut aussi inclure une instruction else permettant d'exécuter des instructions dans le cas où la condition n'est pas réalisée.

if condition
then 
    instruction(s)
else 
    instruction(s)
fi

Il est bien sûr possible d'imbriquer des if dans d'autres if et notamment des constructions telles que celle-ci sont assez courantes :

if condition1
then
    instruction(s)
else
    if condition2
    then
        instruction(s)
    else
        if condition3
            ...
        fi
    fi
fi

Pour permettre d'alléger ce type de code, ksh fournit un raccourci d'écriture : elif. Le code précédent pourrait être réécrit ainsi :

if condition1
then
    instruction(s)
elif condition2
then
    instruction(s)
elif condition3
    ...
fi

L'instruction case permet de comparer une valeur avec une liste d'autres valeurs et d'exécuter un bloc d'instructions lorsque une des valeurs de la liste correspond.

case valeur_testee in
valeur1) instruction(s);;
valeur2) instruction(s);;
valeur3) instruction(s);;
...
esac

Ce code est plus lisible que son équivalent avec if :

if [ valeur_teste = valeur1 ]
    then instruction(s)
elif [ valeur_testee = valeur2 ]
    then instruction(s)
elif [ valeur_testee = valeur3 ]
    then instruction(s)
...
fi

Les valeurs peuvent contenir des caractères joker, ainsi :

case $a in
t?t?) echo "ok";;
*) exit 1;;
esac

affichera ok si la variable a a une valeur correspondant au motif t?t?, comme par exemple toto ou tata.