La condition IF
>>> Code BASH
Version PDF

Dans cette astuce nous apprendrons à utiliser la condition "if".


Sommaire :

I) La condition if
1) Condition simple
2) Boucles if imbriquées
3) Multi-test
II) Les tests
1) Tests de chaînes de caractères
2) Tests sur les nombres
3) Tests sur les fichiers
III) Utilisation de case


I) La condition if

Haut de page

1) Condition simple

Pour définir une variable, suivez les instructions suivantes :

 Créez un nouveau script en tapant la commande :

vim script-3.sh

 Commencez le script par écrire le type de code utilisé :

#!/bin/bash

Le début de la condition commence par "if" et se termine par "fi". Voici l’architecture de la condition :

if [ test ]
then
	Commandes exécutées si test est vrai
else
	Commandes exécutées si test n'est pas vrai
fi

On peut expliquer la condition comme cela :

Si test est vrai
Alors exécuter la commande
Sinon exécuter cette commande
fin si

 Revenons à notre script, nous allons faire en sorte que le script nous pose la question :

  • Voulez-vous afficher le message (Oui\Non) ?
     Si la réponse est oui, alors on affiche le message suivant "Bienvenue sur Idum".
     Si la réponse est non, on affiche le message "pas de message".
     Tapez les lignes suivantes :
read -p 'Voulez-vous afficher le message (oui\non) ? ' -n 3 reponse

if [ $reponse = "oui" ]
then
	echo -e "\nBienvenue sur Idum\n"
else
	echo -e "\npas de message\n"
fi

 Exécutez le script avec la commande "bash script-3.sh". Vous devez obtenir ceci :

root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (oui\non) ? oui
Bienvenue sur Idum

root@debian:~#
root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (oui\non) ? non
Bienvenue sur Idum

2) Boucles if imbriquées

 Nous voulons maintenant imbriquer plusieurs tests dans une même condition. Nous utiliserons "elif" que l’on peut traduire par "Sinon si".
 On reprend notre exemple précédent en le modifiant comme ceci :

  • Faire en sorte que le script nous pose la question :
    • Voulez-vous afficher le message (Oui\Non) ?
  • Si la réponse est oui, alors on affiche le message suivant "Bienvenue sur Idum".
  • Si la réponse est non, on affiche le message "pas de message".
  • Si la réponse est ni "Ou"i ni "Non", on affiche le message "Vous ne savez pas taper Oui ou Non !!" .
     Tapez les lignes suivantes :
read -p 'Voulez-vous afficher le message (Oui\Non) ? ' -n 3 reponse

if [ $reponse = "oui" ]
then
	echo -e "\nBienvenue sur Idum\n"
elif [ $reponse = "non" ]
then
	echo -e "\npas de message\n"
else
	echo -e "\nVous ne savez pas taper Oui ou Non !!\n"
fi

 Vous devez obtenir ceci :

root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (oui\non) ? non
pas de message

root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (oui\non) ? oui
Bienvenue sur Idum

root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (oui\non) ? aze
Vous ne savez pas taper Oui ou Non !!

3) Multi-test

Il peut arriver que nous ayons besoin de tester plusieurs choses pour valider la condition. Reprenons notre exemple précédent, la réponse "oui" attendue doit être identique à la valeur dans le script. Il faut donc que la casse soit aussi identique. Si on tape "OUI", le script ne va pas comprendre "oui". Voici une solution pour résoudre le problème :

read -p 'Voulez-vous afficher le message (Oui\Non) ? ' -n 3 reponse

if [ $reponse = "oui" ] || [ $reponse = "OUI" ]
then
	echo -e "\nBienvenue sur Idum\n"
elif [ $reponse = "non" ] || [ $reponse = "NON" ]
then
	echo -e "\npas de message\n"
else
	echo -e "\nVous ne savez pas taper Oui ou Non !!\n"
fi

 Vous devez obtenir ceci :

root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (Oui\Non) ? oui
Bienvenue sur Idum

root@debian:~#
root@debian:~# bash script-v3.sh
Voulez-vous afficher le message (Oui\Non) ? OUI
Bienvenue sur Idum

Il faut connaitre deux symboles :
 && : Correspond à "et"
 || : Correspond à "ou"

 Si vous voulez faire plus de deux tests, je vous conseille cette syntaxe :

read -p 'Voulez-vous afficher le message (Oui\Non) ? ' -n 3 reponse

if [[ $reponse = "oui" || $reponse = "Oui" || $reponse = "OUI" ]];
then
        echo -e "\nBienvenue sur Idum\n"
elif [[ $reponse = "non" || $reponse = "Non" || $reponse = "NON" ]];
then
        echo -e "\npas de message\n"
else
        echo -e "\nVous ne savez pas taper Oui ou Non !!\n"
fi

 Je n’ai pas illustré la fonction "&&", nous faisons un nouveau test :

  • Si la variable Paul = OK et si la variable Antoine = OK
    • Alors on affiche le message "Bienvenue sur Idum".
    • Sinon on affiche "pas de message".
       Tapez les lignes suivantes :
read -p 'Paul : OK ou NOK ? ' Paul
read -p 'Antoine : OK ou NOK ? ' Antoine

if [[ $Paul = "OK" && $Antoine = "OK" ]];
then
        echo -e "\nBienvenue sur Idum\n"
else
        echo -e "\npas de message\n"
fi

 Vous obtenez ceci :

root@debian:~# bash script-v3.sh
Paul : OK ou NOK ? OK
Antoine : OK ou NOK ? OK

Bienvenue sur Idum

root@debian:~# bash script-v3.sh
Paul : OK ou NOK ? OK
Antoine : OK ou NOK ? Nok

pas de message

II) Les tests

Haut de page

Pour utiliser correctement la condition IF, il faut savoir qu’elles sont les tests que l’on peut faire. Trois types de tests sont possibles :
 Tests sur des chaînes de caractères, ce sont les tests que nous avons réalisé jusqu’à maintenant.
 Tests sur des nombres
 Tests sur des fichiers

1) Tests de chaînes de caractères

Nous avons déjà le test de chaînes de caractères dans les exemples précédents.
Par exemple :
$reponse = "oui" : on compare la chaîne de caractères contenue dans la variable "reponse" pour savoir si elle est identique à la chaîne "oui".

Voici d’autres exemples de tests de chaînes de caractères :

 $chaine1 = $chaine2 : Vérifie si deux chaînes sont identiques
 $chaine1 != $chaine2 : Vérifie si les deux chaînes sont différentes
 -z $chaine : Vérifie si la chaîne est vide
 -n $chaine : Vérifie si la chaîne est non vide

2) Tests sur les nombres

 Voici les tests sur les nombres que nous pouvons faire :

  • ENTIER1 -eq ENTIER2 : Vérifie que ENTIER1 et ENTIER2 sont égaux
  • ENTIER1 -ge ENTIER2 : Vérifie que ENTIER1 est supérieur ou égal à ENTIER2
  • ENTIER1 -gt ENTIER2 : Vérifie que ENTIER1 est strictement supérieur à ENTIER2
  • ENTIER1 -le ENTIER2 : Vérifie que ENTIER1 est inférieur ou égal à ENTIER2
  • ENTIER1 -lt ENTIER2 : Vérifie que ENTIER1 est strictement inférieur à ENTIER2
  • ENTIER1 -ne ENTIER2 : Vérifie que ENTIER1 et ENTIER2 sont différents

 Voici un script pour illustrer :

read -p "Age de Paul ? " Paul
read -p "Age d'Antoine ? " Antoine

if [ $Paul -lt $Antoine ]
then
	echo "Paul est plus vieux"
elif [ $Paul -eq $Antoine ]
then
	echo "Paul et Antoine ont le meme age"
else
	echo "Paul est plus jeune qu'Antoine"
fi

 Vous devez obtenir ceci :

root@debian:~# bash script-v3.sh
Age de Paul ? 10
Age d'Antoine ? 12
Paul est plus jeune qu'Antoine

root@debian:~# bash script-v3.sh
Age de Paul ? 10
Age d'Antoine ? 10
Paul et Antoine ont le meme age

root@debian:~# bash script-v3.sh
Age de Paul ? 12
Age d'Antoine ? 10
Paul est plus vieux

3) Tests sur les fichiers

 Voici les tests sur les fichiers que nous pouvons faire :

  • FICHER1 -ef FICHIER2 : Vérifie que FICHIER1 et FICHIER2 ont les mêmes numéros de périphérique et d’inode
  • FICHIER1 -nt FICHIER2 : Vérifie que la date de modification de FICHIER1 est plus récente que celle de FICHIER2
  • FICHIER1 -ot FICHIER2 : Vérifie que FICHIER1 est plus vieux que FICHIER2
  • -b FICHIER : Vérifie que FICHIER existe, c’est un fichier spécial en mode bloc
  • -c FICHIER : Vérifie que FICHIER existe, c’est un fichier spécial en mode caractère
  • -d FICHIER : Vérifie que FICHIER existe et est un répertoire
  • -e FICHIER : Vérifie que FICHIER existe
  • -f FICHIER : Vérifie que FICHIER existe et est un fichier ordinaire
  • -g FICHIER : Vérifie que FICHIER existe et a son bit set-GID positionné
  • -G FICHIER : Vérifie que FICHIER existe et appartient au GID effectif de l’appelant
  • -h FICHIER : Vérifie que FICHIER existe et est un lien symbolique (identique à -L)
  • -k FICHIER : Vérifie que FICHIER existe, son bit collant (« sticky ») est positionné
  • -L FICHIER : Vérifie que FICHIER existe et est un lien symbolique (identique à -h)
  • -O FICHIER : Vérifie que FICHIER existe et appartient à l’UID effectif de l’appelant
  • -p FICHIER : Vérifie que FICHIER existe et est un tube nommé
  • -r FICHIER : Vérifie que FICHIER existe et est lisible
  • -s FICHIER : Vérifie que FICHIER existe et a une taille non nulle
  • -S FICHIER : Vérifie que FICHIER existe et est une socket
  • -t FD  : Vérifie que le descripteur de fichier FD est ouvert sur un terminal
  • -u FICHIER : Vérifie que FICHIER existe et son bit setuid est positionné
  • -w FICHIER : Vérifie que FICHIER existe et est accessible en écriture
  • -x FICHIER : Vérifie que FICHIER existe et est exécutable (ou peut être parcouru dans le cas d’un répertoire)

 Voici un script pour illustrer :

read -p "saisissez le nom d'un dossier ou fichier : " NOM

if [ -d $NOM ]
then
	echo "$NOM est un répertoire"
elif [ -f $NOM ]
then
	echo "$NOM est un fichier"
elif [ -e $NOM ]
then
	echo "$NOM existe"

else
	echo "$NOM n'existe pas"
fi

 Vous devez obtenir ceci :

root@debian:~# bash script-v3.sh
saisissez le nom d'un dossier ou fichier : /home
/home est un répertoire

root@debian:~# bash script-v3.sh
saisissez le nom d'un dossier ou fichier : /home/resolv.conf
/home/resolv.conf n'existe pas

root@debian:~# bash script-v3.sh
saisissez le nom d'un dossier ou fichier : /etc/resolv.conf
/etc/resolv.conf est un fichier

III) Utilisation de case

Haut de page

Si vous avez à faire une condition if avec beaucoup de choix, comme dans un menu. Je vous conseille d’utiliser la fonction "case".

Voici un exemple :

echo -e "Pour le choix 1, tapez 1\nPour le choix 2, tapez 2\nPour le choix 3, tapez 3\nPour le choix 4, tapez 4\n
read -p "Selectionnez un choix " CHOIX


case $CHOIX in
	"1")
	echo "Vous avez choisi le choix 1"
	;;
	"2")
	echo "Vous avez choisi le choix 2"
	;;
	"3")
	echo "Vous avez choisi le choix 3"
	;;
	"4")
	echo "Vous avez choisi le choix 4"
	;;
	*)
	echo "Mauvais choix"
	;;
esac

 Vous devez obtenir ceci :

root@debian:~# bash script-v3.sh
Pour le choix 1, tapez 1
Pour le choix 2, tapez 2
Pour le choix 3, tapez 3
Pour le choix 4, tapez 4

Selectionnez un choix 1
Vous avez choisi le choix 1

root@debian:~# bash script-v3.sh
Pour le choix 1, tapez 1
Pour le choix 2, tapez 2
Pour le choix 3, tapez 3
Pour le choix 4, tapez 4

Selectionnez un choix 2
Vous avez choisi le choix 2

root@debian:~# bash script-v3.sh
Pour le choix 1, tapez 1
Pour le choix 2, tapez 2
Pour le choix 3, tapez 3
Pour le choix 4, tapez 4

Selectionnez un choix 3
Vous avez choisi le choix 3

root@debian:~# bash script-v3.sh
Pour le choix 1, tapez 1
Pour le choix 2, tapez 2
Pour le choix 3, tapez 3
Pour le choix 4, tapez 4

Selectionnez un choix 4
Vous avez choisi le choix 4

root@debian:~# bash script-v3.sh
Pour le choix 1, tapez 1
Pour le choix 2, tapez 2
Pour le choix 3, tapez 3
Pour le choix 4, tapez 4

Selectionnez un choix 5
Mauvais choix
 
 
 
 
 
Commentaires :