Différences entre les versions de « Programmation Bash/Tests »

fusion d'historiques
m (JackPotte a déplacé la page Programmation bash-ksh/Tests vers Programmation Bash/Tests sans laisser de redirection)
(fusion d'historiques)
{{Programmation Bash}}
 
== Conditions ==
Deux syntaxes équivalentes permettent de tester des expressions : <code>[ expression ]</code> et <code>test expression</code>. Elles renvoient toutes les deux un code de retour valant 0 si l'expression est vraie et 1 si l'expression est fausse.
 
 
 
[[Catégorie:Programmation bash-ksh (livre)]]
== Syntaxe du test ==
Deux syntaxes équivalentes permettent de réaliser des tests sur des opérandes:
<pre>
[ expression ]
</pre>
ou
<pre>
test expression
</pre>
 
 
Ces deux commandes renvoient un code de retour valant 0 si l'expression est vraie et 1 si l'expression est fausse.
Exemple :
<pre>
$ [ "salut" = "salut" ]
$ echo $?
0
$ [ 2 -eq 3 ]
$ echo $?
1
$ [ -f /tmp/fichier ]
$ echo "file exist"
 
</pre>
La commande <code>test</code> fonctionne de manière complétement équivalente :
<pre>
$ test "salut" = "salut"
$ echo $?
0
$ test 2 -eq 3
$ echo $?
1
</pre>
 
mais certains lancements peuvent être fait sous certaine condition système:
<pre>
pidof api && do_some_thing || exit
</pre>
=== Tester une variable ===
Il est tout à fait possible de tester le contenu d'une variable avec les commandes <code>test</code> ou <code>[</code> :
<source lang="bash">
[ $a = toto ]
</source>
la substitution de la variable par sa valeur est alors effectuée et le test est vrai si la variable contient la valeur <code>toto</code> et faux sinon. Par contre, si la variable <code>a</code> n'est pas définie lors du test, la substitution de la ligne sera :
<source lang="bash">
[ = toto ]
</source>
ce qui provoquera une erreur. Il est donc préférable de toujours protéger une variable lors d'un test soit avec des guillemets :
<source lang="bash">
[ "$a" = toto ]
</source>
soit avec un préfixe :
<source lang="bash">
[ x$a = xtoto ]
</source>
Attention, dans ce cas un caractère espace dans $a pose quand même un problème s'il est substitué. Il faut donc préférer la solution précédente.
 
== Tests sur les objets du système de fichiers ==
 
Les opérateurs de tests disponibles sont, pour les les objets du système de fichiers :
* <code>[ -e $FILE ]</code>
vrai si l'objet désigné par $FILE existe dans le répertoire courant,
* <code>[ -s $FILE ]</code>
vrai si l'objet désigné par $FILE existe dans le répertoire courant et si sa taille est supérieure à zéro,
* <code>[ -f $FILE ]</code>
vrai si l'objet désigné par $FILE est un fichier dans le répertoire courant,
* <code>[ -r $FILE ]</code>
vrai si l'objet désigné par $FILE est un fichier lisible dans le répertoire courant,
* <code>[ -w $FILE ]</code>
vrai si l'objet désigné par $FILE est un fichier inscriptible dans le répertoire courant,
* <code>[ -x $FILE ]</code>
vrai si l'objet désigné par $FILE est un fichier exécutable dans le répertoire courant,
* <code>[ -d $FILE ]</code>
vrai si l'objet désigné par $FILE est un répertoire dans le répertoire courant.
 
== Tests sur les chaînes de caractères ==
 
Les opérateurs de tests disponibles sont, pour les chaînes :
* <code>[ c1 = c2 ]</code>
vrai si c1 et c2 sont égaux,
* <code>[ c1 != c2 ]</code>
vrai si c1 et c2 sont différents,
* <code>[ -z c ]</code>
vrai si c est une chaîne vide (''Zero''),
* <code>[ -n c ]</code>
vrai si c n'est pas une chaîne vide (''Non zero'').
 
== Tests sur les nombres (entiers) ==
 
Pour les nombres :
* <code>[ n1 -eq n2 ]</code>
vrai si n1 et n2 sont égaux (''EQual''),
* <code>[ n1 -ne n2 ]</code>
vrai si n1 et n2 sont différents (''Not Equal''),
* <code>[ n1 -lt n2 ]</code>
vrai si n1 est strictement inférieur à n2 (''Less Than''),
* <code>[ n1 -le n2 ]</code>
vrai si n1 est inférieur ou égal à n2 (''Less or Equal''),
* <code>[ n1 -gt n2 ]</code>
vrai si n1 est strictement supérieur à n2 (''Greater Than''),
* <code>[ n1 -ge n2 ]</code>
vrai si n1 est supérieur ou égal à n2 (''Greater or Equal'').
 
== Tests et logique ==
Ou comment introduire une alternative logique :
* <code>[ ! e ]</code>
vrai si e est faux. ! est la négation.
* <code>[ e1 -a e2 ]</code>
vrai si e1 et e2 sont vrais. -a ou le '''et''' logique (''And'').
* <code>[ e1 -o e2 ]</code>
vrai si e1 ou e2 est vrai. -o ou le '''ou''' logique (''Or'').
 
== Un exemple complet ==
<source lang="bash">
#!/bin/bash
read -p "Si vous etes d'accord entrez o ou oui : " reponse
if [ ! "$reponse" = "o" -a ! "$reponse" = "oui" ]; then
echo "Non, je ne suis pas d'accord !"
else
echo "Oui, je suis d'accord"
fi
</source>
L'exemple montre la manière dont on utilise des négations avec un ''et'' logique. En particulier, il ne faut pas utiliser de parenthèses. Le ''non'' (le point d'exclamation) s'applique à la proposition logique qui vient ensuite (seulement ''"$reponse" = "o"''). À noter que ''read -p'' permet de poser une question et de stocker la réponse de l'utilisateur dans une variable.