Tests et conditions en Shell script

Samuel Chevalley
20 février 2016

Un script Shell se présente sous la forme d’un fichier contenant une ou plusieurs commandes qui seront exécutées de manière séquentielle. Il pourra donc permettre d’automatiser une série d’opérations.
 

Les opérateurs de test

Lors d’un test ( [ expression ] ou test expression ), le code de retour sera de 0 si l’expression est vrai ou de 1 si l’expression est fausse.

Test sur les objets

[ -d fichier ]
Vrai si le fichier existe et est un répertoire.
[ -e fichier ]
Vrai si le fichier existe.
[ -f fichier ]
Vrai si le fichier existe et est un fichier ordinaire.
[ -h (ou -L) fichier ]
Vrai si le fichier existe et est un lien symbolique.
[ -r fichier ]
Vrai si le fichier existe et est lisible.
[ -w fichier ]
Vrai si le fichier existe et est accessible en écriture.
[ -x fichier ]
Vrai si le fichier existe et est exécutable.
[ -s fichier ]
Vrai si le fichier existe et a une taille supérieure à zéro.
[ -z chaîne ]
Vrai si la longueur de la chaîne est nulle.
[ -n chaîne ]
Vrai si la longueur de la string n’est pas nulle.
[ -S fichier ]
Vrai si le fichier existe et est une socket.
[ -t [fd] ]
Vrai si fd est ouvert sur un terminal. Si fd est omis, la valeur par défaut est 1 (sortie standard).
[ -u fichier ]
Vrai si le fichier existe et a son bit Set-UID positionné.
[ -O fichier ]
Vrai si le fichier existe et appartient à l’UID effectif de l’appelant.
[ -G fichier ]
Vrai si le fichier existe et appartient au GID effectif de l’appelant.
[ -b fichier ]
Vrai si le fichier existe et est spécial en mode bloc.
[ -p fichier ]
Vrai si le fichier existe et est un tube nommé.
[ -c fichier ]
Vrai si le fichier existe et est spécial en mode caractère.
[ -g fichier ]
Vrai si le fichier existe et a son bit Set-GID positionné.
[ -k fichier ]
Vrai si le fichier existe et a son bit collant (Sticky) positionné.
[ fichier1nt fichier2 ]
Vrai si fichier1 est plus récent (d’après les dates de modification) que fichier2.
[ fichier1ot fichier2 ]
Vrai si fichier1 est plus ancien que fichier2
[ fichier1 -ef fichier2 ]
Vrai si fichier1 et fichier2 ont les mêmes numéros de périphérique et d’i-noeud.

 

Test sur les chaînes de caractères

[ chaîne1 = chaîne2 ]
Vrai si les deux chaînes sont égales.
[ chaîne1 != chaîne2 ]
Vrai si les deux chaînes sont différentes.

 

Test sur les nombres

[ n1 -eq n2 ]
Vrai si n1 et n2 sont égaux.

[ n1 -ne n2 ]
Vrai si n1 et n2 sont différents.

[ n1 -lt n2 ]
Vrai si n1 est strictement inférieur à n2.

[ n1 -le n2 ]
Vrai si n1 est inférieur ou égal à n2.

[ n1 -gt n2 ]
Vrai si n1 est strictement supérieur à n2.

[ n1 -ge n2 ]
Vrai si n1 est supérieur ou égal à n2.

 

Test et logique

[ ! expr ]
Vrai si expr est fausse.

[ expr1a expr2 ]
Vrai si expr1 et expr2 sont toutes les deux vraies.

[ expr1o expr2 ]
Vrai si expr1 ou expr2 est vraie.

 

Instruction If

L’instruction « if » permet d’effectuer des opérations si une condition est réalisée, elle possède 3 niveaux de complexité.

Niveau 1 :

if CONDITION
    then instruction(s)
fi

Niveau 2 :

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

Niveau 3 :

if CONDITION1
    then instruction(s)
elif CONDITION2
    then instruction(s)
elif CONDITION3
    ...
fi

Exemple :

echo "Aimez-vous les épinards ? (oui/non)"
read rep
if [ "$rep" = "oui" ]
 then echo "C'est bien"
elif [ "$rep" = "non" ]
 then echo "Pas bien"
else echo "Vous devez répondre par oui ou pas non"
fi

 

Instruction Case

Le « case » fonctionne comme une série de if..elif..elif..elif..elif..else..fi mais apparaît de façon plus claire.

case VARIABLE in 
  cas_1) instruction(s);; 
  cas_2) instruction(s);; 
  cas_3) instruction(s);; 
  *)     instruction(s)_sinon;; 
esac

Exemple (en faisant la même chose que pour l’exemple du « if ») :

echo "Aimez-vous les épinards ? (oui/non)"
read rep
case $rep in
"oui") echo "C'est bien";;
"non") echo "Pas bien";;
*) echo "Il faut répondre oui ou non";;
esac

 

La boucle For

La boucle « for » s’articule autour de 2 schémas.

Schéma 1 :

for VAR in LISTE #où VAR est une variable et LISTE une liste d'éléments
do
instruction(s)
done

Exemple :

for i in 1 2 3
do
echo "i =" $i
done

Résultat :

i = 1
i = 2
i = 3

Schéma 2 :

for ((initialisation de VAR; contrôle de VAR; modification de VAR))
do
instruction(s)
done

Ce qui permet par exemple de coder un compte à rebours de 0 à 5:

for ((i=0; i<=5; i++))
do
echo $i
done

Résultat :

0
1
2
3
4
5

 

La boucle While

La boucle « while » s’articule autour de ce schéma :

while [ CONDITION ]
do
instruction(s)
done

CONDITION est une condition de continuation de la boucle et tant que cette condition est vraie, la boucle continue.

Généralement, il faut définir les variables de CONDITION avant le while, sinon la condition n’est pas vérifiable (vu qu’elle n’est pas définie).

Exemple :

i=0
while [ $i -le 5 ] #ou while ((i<=5))
do
echo $i
((i++))
done

Résultat :

0
1
2
3
4
5

Pour la syntaxe des opérateurs de test et de comparaison numérique dans les crochets (exemple avec -le), reportez-vous plus bas.

 

La boucle Until

La boucle « until » (même synthaxe que la boucle « while ») s’arrête quand CONDITION est vraie, alors que la boucle « while » continue tant que CONDITION est vraie.