Outils pour utilisateurs

Outils du site


test_operateur

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

test_operateur [2016/08/24 18:58] (Version actuelle)
Ligne 1: Ligne 1:
 +====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.
 +<​code="​bash">​
 +$ [ 2 = 2 ]
 +$ echo $?
 +0
 +$ [ 2 = 3 ]
 +$ echo $?
 +1
 +</​code>​
 +La commande <​code>​test</​code>​ fonctionne de manière complètement équivalente :
 +<​code="​bash">​
 +$ test 2 = 2
 +$ echo $?
 +0
 +$ test 2 = 3
 +$ echo $?
 +1
 +</​code>​
 +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 la chaîne vide ;
 +* <​code>​-n c</​code>,​ vrai si c n'est pas la chaîne vide.
 +Pour les nombres :
 +* <​code>​n1 -eq n2</​code>,​ vrai si n1 et n2 sont égaux ;
 +* <​code>​n1 -ne n2</​code>,​ vrai si n1 et n2 sont différents ;
 +* <​code>​n1 -lt n2</​code>,​ vrai si n1 est strictement inférieur à n2 ;
 +* <​code>​n1 -le n2</​code>,​ vrai si n1 est inférieur ou égal à n2 ;
 +* <​code>​n1 -gt n2</​code>,​ vrai si n1 est strictement supérieur à n2 ;
 +* <​code>​n1 -ge n2</​code>,​ vrai si n1 est supérieur ou égal à n2.
 +Pour les expressions :
 +* <​code>​! e</​code>,​ vrai si e est faux ;
 +* <​code>​e1 -a e2</​code>,​ vrai si e1 et e2 sont vrais ;
 +* <​code>​e1 -o e2</​code>,​ vrai si e1 ou e2 est vrai.
 +
 +== Test <​code>​if</​code>​ ==
 +L'​instruction <​code>​if</​code>​ permet d'​effectuer des opérations si une condition est réalisée.
 +<​code="​bash">​
 +if condition
 +    then instruction(s)
 +fi
 +</​code>​
 +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.
 +<​code="​bash">​
 +if condition
 +    then instruction(s)
 +else instruction(s)
 +fi
 +</​code>​
 +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 :
 +<​code="​bash">​
 +if condition1
 +    then instruction(s)
 +else
 +    if condition2
 +        then instruction(s)
 +    else
 +        if condition3
 +            ...
 +        fi
 +    fi
 +fi
 +</​code>​
 +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 :
 +<​code="​bash">​
 +if condition1
 +    then instruction(s)
 +elif condition2
 +    then instruction(s)
 +elif condition3
 +    ...
 +fi
 +</​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.
 +<​code="​bash">​
 +case valeur_testee in
 +valeur1) instruction(s);;​
 +valeur2) instruction(s);;​
 +valeur3) instruction(s);;​
 +* ) instruction_else(s);;​
 +...
 +esac
 +</​code>​
 +Ce code est équivalent à :
 +<​code="​bash">​
 +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
 +</​code>​
 +
 +
 +
 +
 +== Syntaxe du test ==
 +Deux syntaxes équivalentes permettent de réaliser des tests sur des opérandes:
 + <​code>​
 +[ expression ]
 +</​code> ​
 +ou
 +<​code>​
 +test expression
 +</​code>​
 +
 +
 +Ces deux commandes renvoient un code de retour valant 0 si l'​expression est vraie et 1 si l'​expression est fausse. ​
 +Exemple :
 +<​code>​
 +$ [ "​salut"​ = "​salut"​ ]
 +$ echo $?
 +0
 +$ [ 2 -eq 3 ]
 +$ echo $?
 +1
 +$ [ -f /​tmp/​fichier ]
 +$ echo "file exist"
 +
 +</​code>​
 +La commande <​code>​test</​code>​ fonctionne de manière complétement équivalente :
 +<​code>​
 +$ test "​salut"​ = "​salut"​
 +$ echo $?
 +0
 +$ test 2 -eq 3
 +$ echo $?
 +1
 +</​code>​
 +
 +mais certains lancements peuvent être fait sous certaine condition système:
 +<​code>​
 +pidof api && do_some_thing || exit
 +</​code>​
 +=== Tester une variable ===
 +Il est tout à fait possible de tester le contenu d'une variable avec les commandes <​code>​test</​code>​ ou <​code>​[</​code>​ :
 +<​code="​bash">​
 +[ $a = toto ]
 +</​code>​
 +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 :
 +<​code="​bash">​
 +[  = toto ]
 +</​code>​
 +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 :
 +<​code="​bash">​
 +[ "​$a"​ = toto ]
 +</​code>​
 +soit avec un préfixe :
 +<​code="​bash">​
 +[ x$a = xtoto ]
 +</​code>​
 +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 ==
 +<​code="​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
 +</​code>​
 +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.
  
test_operateur.txt · Dernière modification: 2016/08/24 18:58 (modification externe)