« Programmation Bash/Tests » : différence entre les versions

Aller à la navigation Aller à la recherche
m
<source> -> <syntaxhighlight> (phab:T237267)
m (<source> -> <syntaxhighlight> (phab:T237267))
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.
Attention en shell (bin bash) on ne met pas de if avec des = , on utilise les valeurs eq, lt etc...)
<sourcesyntaxhighlight lang="bash">
$ [ 2 = 2 ]
$ echo $?
$ echo $?
1
</syntaxhighlight>
</source>
La commande <code>test</code> fonctionne de manière complétement équivalente :
<sourcesyntaxhighlight lang="bash">
$ test 2 = 2
$ echo $?
$ echo $?
1
</syntaxhighlight>
</source>
Les opérateurs de tests disponibles sont, pour les chaînes :
* <code>c1 = c2</code>, vrai si c1 et c2 sont égaux ;
== Test <code>if</code> ==
L'instruction <code>if</code> permet d'effectuer des opérations si une condition est réalisée.
<sourcesyntaxhighlight lang="bash">
if condition
then instruction(s)
fi
</syntaxhighlight>
</source>
L'instruction <code>if</code> peut aussi inclure une instruction else permettant d'exécuter des instructions dans le cas ou la condition n'est pas réalisée.
<sourcesyntaxhighlight lang="bash">
if condition
then instruction(s)
else instruction(s)
fi
</syntaxhighlight>
</source>
Il est bien sur possible d'imbriquer des <code>if</code> dans d'autres <code>if</code> et notamment des constructions telles que celle ci sont assez courantes :
<sourcesyntaxhighlight lang="bash">
if condition1
then instruction(s)
fi
fi
</syntaxhighlight>
</source>
Pour permettre d'alléger ce type de code, ksh fournit un raccourci d'écriture : <code>elif</code>. Le code précédent pourrait être réécrit ainsi :
<sourcesyntaxhighlight lang="bash">
if condition1
then instruction(s)
...
fi
</syntaxhighlight>
</source>
 
== Test <code>case</code> ==
L'instruction <code>case</code> permet de comparer une valeur avec une liste d'autres valeurs et d'exécuter un bloc d'instructions lorsque une des valeurs de la liste correpsond.
<sourcesyntaxhighlight lang="bash">
case valeur_testee in
valeur1) instruction(s);;
...
esac
</syntaxhighlight>
</source>
Ce code est équivalent à :
<sourcesyntaxhighlight lang="bash">
if [ valeur_teste = valeur1 ]
then instruction(s)
instruction_else(s)
fi
</syntaxhighlight>
</source>
 
 
=== Tester une variable ===
Il est tout à fait possible de tester le contenu d'une variable avec les commandes <code>test</code> ou <code>[</code> :
<sourcesyntaxhighlight lang="bash">
[ $a = toto ]
</syntaxhighlight>
</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 :
<sourcesyntaxhighlight lang="bash">
[ = toto ]
</syntaxhighlight>
</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 :
<sourcesyntaxhighlight lang="bash">
[ "$a" = toto ]
</syntaxhighlight>
</source>
soit avec un préfixe :
<sourcesyntaxhighlight lang="bash">
[ x$a = xtoto ]
</syntaxhighlight>
</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.
 
 
== Un exemple complet ==
<sourcesyntaxhighlight lang="bash">
#!/bin/bash
read -p "Si vous etes d'accord entrez o ou oui : " reponse
echo "Oui, je suis d'accord"
fi
</syntaxhighlight>
</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.
1 535

modifications

Menu de navigation