samedi 26 mars 2005

Les conditions

LES CONDITIONS
Les conditions sous Bash sont très différentes de ce qu'on peut retrouver dans les autres langages de programmation telle que le C, pascal, Java... Les espaces sont importants, s'ils ne sont pas pris en considérations, il est possible que le script ne puisse fonctionner. Une autre particularité est qu'il existe différents paramètres selon ce qu'on désire tester.

Tableau des opérateurs

Opérateur Description (retourne vrai si..)
-d si le répertoire existe
-e si le fichier existe
-f si le fichier (pas un répertoire ou fichier de périphérique: /dev/sda1...)
-r si le fichier peut être lu
-w si le fichier peut être écrit
-x si le fichier peut être exécuté
-L si le fichier est un lien symbolique
-z si la chaine de caractère est nulle
-n si la chaine de caractère n'est pas nulle
-eq s'ils sont équivalents (nombre)
-neq s'ils ne sont pas équivalents
= ou == si les chaines de caractère ou nombre sont égaux
!= s'ils ne sont pas égaux
-lt est plus petit que
-gt est plus grand que
-le est plus petit ou égale
-ge est plus grand ou égale
-a ou && et logique
-o ou || ou logique

Quelques exemples

On vérifie ci-dessous si le fichier qemu.htm existe. S'il existe, nous affichons un message.
if [ -e qemu.htm ]; then
  echo "Qemu.htm existe";
fi
On vérifie ci-dessous si le contenu de la variable X est plus petit que Y.
X=3
Y=12
if [ $X -lt $Y ]
then
  echo "\$X=$X, est plus grand ou égale \$Y=${Y}"
fi
Notez que si on ne met pas de ";" à la fin du if, le then doit être sur la prochaine ligne. En mettant "\" devant le nom de la variable existante, c'est le nom de la variable qui est affiché.
On vérifie si les chaînes de caractères sont identiques
X="allo"
Y="aillo"
if [ $X = $Y ]; then
 echo "les chaines sont identiques";
else
 echo "les chaines ne sont pas identiques";
fi
Il est possible de savoir si une chaîne de caractère débute ou se termine par un certain caractère.
X="allo"
if [[ $X == a* ]]; then
 echo "$X commence par a";
fi

X="allo2"
if [[ $X == *2 ]]; then
 echo "$X fini par 2";
fi
Les comparaisons binaires peuvent être faites de deux façons avec les opérateurs. Soit, on utilise -a ou && pour le et binaire. Soit on utilise -o ou || pour le ou binaire.
X=33
Y=23
A=12
B=23
if [ $X -gt $Y ] && [ $A -lt $B ]; then
 echo "$X est plus grand que $Y et $A est plus petit que $B ";
fi
Notez que si vous utilisez directement -a (ou -o) vous devez écrire:
X=33
Y=23
A=12
B=23
if [ $X -gt $Y -a $A -lt $B ]; then
 echo "$X est plus grand que $Y et $A est plus petit que $B ";
fi

Imbrication de if

Lorsqu'on a plusieurs de suites, on doit utiliser elif.
X=20
Y=30
Z=40
if [ $Z -lt $X ]; then
 echo "$Z est plus petit que $X";
elif [ $Z -lt $Y ]; then
 echo "$Z est plus petit que $Y";
else
 echo "$Z est plus petit que 50";
fi

Case

Au lieu d'utiliser de nombreux if et else, il peut être pratique d'utiliser un case afin de simplifier le code et de le rendre plus lisible.
echo "Fait t'il soleil ? [oui or non]: "
read reponse
    case $reponse in
        o* | O*)
                echo "vous avez repondu qu'il faisait soleil";
                ;;
        n* | N*)
                echo "vous avez repondu qu'il ne faisait pas soleil";
                ;;
        *)
                echo "vous avez mal répondu à la question";
                ;;
    esac
Vous pouvez noter que chaque condition se termine par ")", qu'à la fin de chaque commande on a ";;" et qu'on inscrit esac à la fin. Il arrive souvent qu'on inscrive la commande à l'envers en bash. Au début de ce script, on pose une question à l'usager. Lorsque l'utilisateur tapera sur une touche et appuiera sur entrée, cette touche sera lu (grâce à la fonction read) et une action sera faite selon sa valeur.

Nous avons completé la partie traitant des conditions. Un script avec tous les exemples peut être téléchargé ici