« Programmation Bash/Tests » : différence entre les versions
Contenu supprimé Contenu ajouté
m JackPotte a déplacé la page Programmation bash-ksh Tests vers Programmation bash-ksh/Tests |
→Tests sur les nombres :
Ca ne fonctionne que sur les entiers (nombre non décimal) |
||
Ligne 1 :
{{Programmation Bash}}
== 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
$ echo $?
1
$ [ -f /tmp/fichier ]
$ echo "file exist"
</pre>
La commande <code>test</code> fonctionne de manière complétement équivalente :
<pre>
$ test
$ echo $?
0
$ test 2
$ echo $?
1
</
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.
[[Catégorie:Programmation Bash (livre)]]
|