« Programmation Bash/Tests » : différence entre les versions
m <source> -> <syntaxhighlight> (phab:T237267) |
|||
Ligne 4 : | Ligne 4 : | ||
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. |
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...) |
Attention en shell (bin bash) on ne met pas de if avec des = , on utilise les valeurs eq, lt etc...) |
||
< |
<syntaxhighlight lang="bash"> |
||
$ [ 2 = 2 ] |
$ [ 2 = 2 ] |
||
$ echo $? |
$ echo $? |
||
Ligne 11 : | Ligne 11 : | ||
$ echo $? |
$ echo $? |
||
1 |
1 |
||
</syntaxhighlight> |
|||
</source> |
|||
La commande <code>test</code> fonctionne de manière complétement équivalente : |
La commande <code>test</code> fonctionne de manière complétement équivalente : |
||
< |
<syntaxhighlight lang="bash"> |
||
$ test 2 = 2 |
$ test 2 = 2 |
||
$ echo $? |
$ echo $? |
||
Ligne 20 : | Ligne 20 : | ||
$ echo $? |
$ echo $? |
||
1 |
1 |
||
</syntaxhighlight> |
|||
</source> |
|||
Les opérateurs de tests disponibles sont, pour les chaînes : |
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 égaux ; |
||
Ligne 40 : | Ligne 40 : | ||
== Test <code>if</code> == |
== Test <code>if</code> == |
||
L'instruction <code>if</code> permet d'effectuer des opérations si une condition est réalisée. |
L'instruction <code>if</code> permet d'effectuer des opérations si une condition est réalisée. |
||
< |
<syntaxhighlight lang="bash"> |
||
if condition |
if condition |
||
then instruction(s) |
then instruction(s) |
||
fi |
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. |
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. |
||
< |
<syntaxhighlight lang="bash"> |
||
if condition |
if condition |
||
then instruction(s) |
then instruction(s) |
||
else instruction(s) |
else instruction(s) |
||
fi |
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 : |
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 : |
||
< |
<syntaxhighlight lang="bash"> |
||
if condition1 |
if condition1 |
||
then instruction(s) |
then instruction(s) |
||
Ligne 65 : | Ligne 65 : | ||
fi |
fi |
||
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 : |
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 : |
||
< |
<syntaxhighlight lang="bash"> |
||
if condition1 |
if condition1 |
||
then instruction(s) |
then instruction(s) |
||
Ligne 75 : | Ligne 75 : | ||
... |
... |
||
fi |
fi |
||
</syntaxhighlight> |
|||
</source> |
|||
== Test <code>case</code> == |
== 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. |
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. |
||
< |
<syntaxhighlight lang="bash"> |
||
case valeur_testee in |
case valeur_testee in |
||
valeur1) instruction(s);; |
valeur1) instruction(s);; |
||
Ligne 87 : | Ligne 87 : | ||
... |
... |
||
esac |
esac |
||
</syntaxhighlight> |
|||
</source> |
|||
Ce code est équivalent à : |
Ce code est équivalent à : |
||
< |
<syntaxhighlight lang="bash"> |
||
if [ valeur_teste = valeur1 ] |
if [ valeur_teste = valeur1 ] |
||
then instruction(s) |
then instruction(s) |
||
Ligne 100 : | Ligne 100 : | ||
instruction_else(s) |
instruction_else(s) |
||
fi |
fi |
||
</syntaxhighlight> |
|||
</source> |
|||
Ligne 145 : | Ligne 145 : | ||
=== Tester une variable === |
=== Tester une variable === |
||
Il est tout à fait possible de tester le contenu d'une variable avec les commandes <code>test</code> ou <code>[</code> : |
Il est tout à fait possible de tester le contenu d'une variable avec les commandes <code>test</code> ou <code>[</code> : |
||
< |
<syntaxhighlight lang="bash"> |
||
[ $a = toto ] |
[ $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 : |
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 : |
||
< |
<syntaxhighlight lang="bash"> |
||
[ = toto ] |
[ = 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 : |
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 : |
||
< |
<syntaxhighlight lang="bash"> |
||
[ "$a" = toto ] |
[ "$a" = toto ] |
||
</syntaxhighlight> |
|||
</source> |
|||
soit avec un préfixe : |
soit avec un préfixe : |
||
< |
<syntaxhighlight lang="bash"> |
||
[ x$a = xtoto ] |
[ 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. |
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. |
||
Ligne 216 : | Ligne 216 : | ||
== Un exemple complet == |
== Un exemple complet == |
||
< |
<syntaxhighlight lang="bash"> |
||
#!/bin/bash |
#!/bin/bash |
||
read -p "Si vous etes d'accord entrez o ou oui : " reponse |
read -p "Si vous etes d'accord entrez o ou oui : " reponse |
||
Ligne 224 : | Ligne 224 : | ||
echo "Oui, je suis d'accord" |
echo "Oui, je suis d'accord" |
||
fi |
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. |
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. |
Version du 16 avril 2020 à 09:37
Conditions
Deux syntaxes équivalentes permettent de tester des expressions : [ expression ]
et test expression
. 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...)
$ [ 2 = 2 ]
$ echo $?
0
$ [ 2 = 3 ]
$ echo $?
1
La commande test
fonctionne de manière complétement équivalente :
$ test 2 = 2
$ echo $?
0
$ test 2 = 3
$ echo $?
1
Les opérateurs de tests disponibles sont, pour les chaînes :
c1 = c2
, vrai si c1 et c2 sont égaux ;c1 != c2
, vrai si c1 et c2 sont différents ;-z c
, vrai si c est une chaîne vide ;-n c
, vrai si c n'est pas une chaîne vide.
Pour les nombres :
n1 -eq n2
, vrai si n1 et n2 sont égaux (equal) ;n1 -ne n2
, vrai si n1 et n2 sont différents (non equal);n1 -lt n2
, vrai si n1 est strictement inférieur à n2 (lower than);n1 -le n2
, vrai si n1 est inférieur ou égal à n2 (lower or equal);n1 -gt n2
, vrai si n1 est strictement supérieur à n2 (greater than) ;n1 -ge n2
, vrai si n1 est supérieur ou égal à n2 (greater or equal).
Pour les expressions :
! e
, vrai si e est faux ;e1 -a e2
, vrai si e1 et e2 sont vrais ;e1 -o e2
, vrai si e1 ou e2 est vrai.
Test if
L'instruction if
permet d'effectuer des opérations si une condition est réalisée.
if condition
then instruction(s)
fi
L'instruction if
peut aussi inclure une instruction else permettant d'exécuter des instructions dans le cas ou la condition n'est pas réalisée.
if condition
then instruction(s)
else instruction(s)
fi
Il est bien sur possible d'imbriquer des if
dans d'autres if
et notamment des constructions telles que celle ci sont assez courantes :
if condition1
then instruction(s)
else
if condition2
then instruction(s)
else
if condition3
...
fi
fi
fi
Pour permettre d'alléger ce type de code, ksh fournit un raccourci d'écriture : elif
. Le code précédent pourrait être réécrit ainsi :
if condition1
then instruction(s)
elif condition2
then instruction(s)
elif condition3
...
fi
Test case
L'instruction case
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.
case valeur_testee in
valeur1) instruction(s);;
valeur2) instruction(s);;
valeur3) instruction(s);;
* ) instruction_else(s);;
...
esac
Ce code est équivalent à :
if [ valeur_teste = valeur1 ]
then instruction(s)
elif [ valeur_testee = valeur2 ]
then instruction(s)
elif [ valeur_testee = valeur3 ]
then instruction(s)
...
else
instruction_else(s)
fi
Syntaxe du test
Deux syntaxes équivalentes permettent de réaliser des tests sur des opérandes:
[ expression ]
ou
test expression
Ces deux commandes renvoient un code de retour valant 0 si l'expression est vraie et 1 si l'expression est fausse.
Exemple :
$ [ "salut" = "salut" ] $ echo $? 0 $ [ 2 -eq 3 ] $ echo $? 1 $ [ -f /tmp/fichier ] $ echo "file exist"
La commande test
fonctionne de manière complètement équivalente :
$ test "salut" = "salut" $ echo $? 0 $ test 2 -eq 3 $ echo $? 1
mais certains lancements peuvent être fait sous certaine condition système:
pidof api && do_some_thing || exit
Tester une variable
Il est tout à fait possible de tester le contenu d'une variable avec les commandes test
ou [
:
[ $a = toto ]
la substitution de la variable par sa valeur est alors effectuée et le test est vrai si la variable contient la valeur toto
et faux sinon. Par contre, si la variable a
n'est pas définie lors du test, la substitution de la ligne sera :
[ = toto ]
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 :
[ "$a" = toto ]
soit avec un préfixe :
[ x$a = xtoto ]
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 objets du système de fichiers :
[ -e $FILE ]
vrai si l'objet désigné par $FILE existe dans le répertoire courant,
[ -s $FILE ]
vrai si l'objet désigné par $FILE existe dans le répertoire courant et si sa taille est supérieure à zéro,
[ -f $FILE ]
vrai si l'objet désigné par $FILE est un fichier dans le répertoire courant,
[ -r $FILE ]
vrai si l'objet désigné par $FILE est un fichier lisible dans le répertoire courant,
[ -w $FILE ]
vrai si l'objet désigné par $FILE est un fichier inscriptible dans le répertoire courant,
[ -x $FILE ]
vrai si l'objet désigné par $FILE est un fichier exécutable dans le répertoire courant,
[ -d $FILE ]
vrai si l'objet désigné par $FILE est un répertoire dans le répertoire courant,
[ -N $FILE ]
vrai si l'objet désigné par $FILE à été modifié depuis la dernière lecture.
Tests sur les chaînes de caractères
Les opérateurs de tests disponibles sont, pour les chaînes :
[ c1 = c2 ]
vrai si c1 et c2 sont égaux,[ c1 != c2 ]
vrai si c1 et c2 sont différents,[ -z c ]
vrai si c est une chaîne vide (Zero),[ -n c ]
vrai si c n'est pas une chaîne vide (Non zero).
Tests sur les nombres (entiers)
Pour les nombres :
[ n1 -eq n2 ]
vrai si n1 et n2 sont égaux (EQual),
[ n1 -ne n2 ]
vrai si n1 et n2 sont différents (Not Equal),
[ n1 -lt n2 ]
vrai si n1 est strictement inférieur à n2 (Less Than),
[ n1 -le n2 ]
vrai si n1 est inférieur ou égal à n2 (Less or Equal),
[ n1 -gt n2 ]
vrai si n1 est strictement supérieur à n2 (Greater Than),
[ n1 -ge n2 ]
vrai si n1 est supérieur ou égal à n2 (Greater or Equal).
Tests et logique
Ou comment introduire une alternative logique :
[ ! e ]
vrai si e est faux. ! est la négation.
[ e1 -a e2 ]
vrai si e1 et e2 sont vrais. -a ou le et logique (And).
[ e1 -o e2 ]
vrai si e1 ou e2 est vrai. -o ou le ou logique (Or).
Un exemple complet
#!/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
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.