====== Opérateurs logiques, Conditions ======
--- //[[nekan@shyrkasystem.com|Nicolas THOREZ]] 2020/03/11 15:37//
===== Opérateurs logiques =====
==== Pour tous ====
|< 100% 10% 10% 50% 30% >|
^ Opérateur ^ Fonction ^ Explication ^ Exemple ^
| ''!'' | négation |Renvoie ''vrai'' si le test est faux | [ -n "A" ]
echo $?
0
[ ! -n "A" ]
echo $?
1
|
| ''-a'' ou ''&&'' | et logique |Renvoie ''vrai'' si les deux variables sont ''vrai'' |[ -n "A" -a -n "B" ]
echo $?
0
|
| ''-o'' ou ''||'' | ou logique |Renvoie ''vrai'' si l'une des deux variables est ''vrai'' |[ -n "A" -o -n "" ]
echo $?
0
|
==== Pour les chaînes de caractères ====
Les tests sur les chaînes sont effectués dans une structure à simple crochet.
Linux observe une strict sensibilité à la casse. ''A'' est donc différent de ''a''.
|< 100% 10% 10% 50% 30% >|
^ Opérateur ^ Fonction ^ Explication ^ Exemple ^
| ''=='' | égal à |Renvoie ''vrai'' si les deux chaînes sont strictement identiques | [ "A" == "A" ]
echo $?
0
[ "A" == "a" ]
echo $?
1
|
| ''!='' | différents de |Renvoie ''vrai'' si les deux chaînes sont différentes | [ "A" == "A" ]
echo $?
1
[ "A" == "a" ]
echo $?
0
|
| ''-z'' | vide |Renvoie ''vrai'' si la chaîne est vide | [ -z "" ]
echo $?
0
[ -z "A" ]
echo $?
1
|
| ''-n'' | non vide |Renvoie ''vrai'' si la chaîne n'est pas vide | [ -n "" ]
echo $?
1
[ -n "A" ]
echo $?
0
|
==== Pour les nombres ====
Les tests sur les nombres sont effectués dans une structure à double crochets.
|< 100% 10% 10% 50% 30% >|
^ Opérateur ^ Fonction ^ Explication ^ Exemple ^
| ''-eq'' | égal à |Renvoie ''vrai'' si les deux nombres sont strictement égaux | [[ 1 -eq 1 ]]
echo $?
0
[[ 1 -eq 0 ]]
echo $?
1
|
| ''-ne'' | différent de |Renvoie ''vrai'' si les deux nombres sont strictement différentes | [[ 1 -eq 1 ]]
echo $?
1
[[ 1 -eq 0 ]]
echo $?
0
|
| ''-gt'' | supérieur à |Renvoie ''vrai'' si le premier nombre est strictement supérieur au second |[[ 1 -gt 0 ]]
echo $?
0
[[ 0 -gt 1 ]]
echo $?
1
|
| ''-ge'' | supérieur ou égal à |Renvoie ''vrai'' si le premier nombre est supérieur ou égal au second |[[ 0 -ge 0 ]]
echo $?
0
[[ 0 -ge 1 ]]
echo $?
1
|
| ''-lt'' | inférieur à |Renvoie ''vrai'' si le premier nombre est strictement inférieur au second |[[ 1 -lt 0 ]]
echo $?
1
[[ 0 -lt 1 ]]
echo $?
0
|
| ''-le'' | inférieur ou égal à |Renvoie ''vrai'' si le premier nombre est inférieur ou égal au second |[[ 0 -le 0 ]]
echo $?
0
[[ 1 -le 0 ]]
echo $?
1
|
==== Pour les expressions régulières ====
Les expressions régulières sont testées avec des doubles crochets et l'opérateur arithmétique ''=~'', exemple :
WORD="ABCD"
[[ $WORD =~ [A-Z]* ]]
echo $?
0
[[ $WORD =~ [0-9]* ]]
echo $?
1
Pour plus d'explications sur les expressions régulières : [[powershell_regex|Les expressions régulières (regex)]]
==== Pour les fichiers et dossiers ====
Les fichiers et dossiers (dénommés dans les exemples par ''FILE'') peuvent être désignés directement ou au travers d'une variable. Leurs écritures peuvent être sous trois formes différentes :
* **simple** : il s'agit simplement du nom de l'objet. Le test sera effectué dans le répertoire courant.
* **relative** : il s'agit d'un fragment d'arborescence. La chaîne commence par 1 ou 2 ''.'', suivie de dossiers et terminée par le nom de l'objet. Le test sera effectué en suivant l'arborescence à partir du dossier courant.
* **absolue** : il s'agit du chemin de l'objet depuis la racine du système. Le test est effectué sur ce chemin complet.
|< 100% 10% 10% 50% 30% >|
^ Opérateur ^ Fonction ^ Explication ^ Exemple ^
| ''-e'' | existe |Renvoie ''vrai'' si l'objet existe | [ -e /etc/issue ]
echo $?
0
[ -e /etc/issuuue ]
echo $?
1
|
| ''-s'' | existe et non vide |Renvoie ''vrai'' si l'objet existe et que sa taille n'est pas nulle | touch test
[ -s ./test ]
echo $?
1
echo "hello" > test
[ -s ./test ]
echo $?
0
|
| ''-N'' | modifié |Renvoie ''vrai'' si l'objet existe et qu'il a été modifié depuis sa dernière lecture | [ -N test ]
echo $?
1
echo "hello" > test
[ -N test ]
echo $?
0
|
| ''-h'' | lien existant |Renvoie ''vrai'' si l'objet existe et qu'il a est un lien symbolique | ln -s /etc/issue /home/user/
[ -h /home/user/issue ]
echo $?
0
[ -h /etc/issue ]
echo $?
1
|
==== Pour les fichiers uniquement ====
|< 100% 10% 10% 50% 30% >|
^ Opérateur ^ Fonction ^ Explication ^ Exemple ^
| ''-f'' | fichier |Renvoie ''vrai'' si l'objet existe et qu'il s'agit d'un fichier | [ -f /etc/issue ]
echo $?
0
[ -f /etc ]
echo $?
1
|
| ''-r'' | lisible |Renvoie ''vrai'' si l'objet existe, qu'il s'agit d'un fichier et qu'il est lisible | [ -r test ]
echo $?
0
chmod +r test
[ -r test ]
echo $?
1
|
| ''-w'' | modifiable |Renvoie ''vrai'' si l'objet existe, qu'il s'agit d'un fichier et qu'on peut le modifier | [ -w test ]
echo $?
0
chmod +w test
[ -w test ]
echo $?
1
|
| ''-x'' | exécutable |Renvoie ''vrai'' si l'objet existe, qu'il s'agit d'un fichier et qu'on peut l'exécuter | [ -x test ]
echo $?
0
chmod +x test
[ -x test ]
echo $?
1
|
==== Pour les dossiers uniquement ====
|< 100% 10% 10% 50% 30% >|
^ Opérateur ^ Fonction ^ Explication ^ Exemple ^
| ''-d'' | dossier |Renvoie ''vrai'' si l'objet existe et qu'il s'agit d'un dossier | [ -d /etc/issue ]
echo $?
1
[ -d /etc ]
echo $?
0
|
===== Conditions & Tests =====
==== if, then, elif, else, fi ====
''if'' permet un test simple. On teste une condition et on applique un traitement si il est ''vrai''. Il est aussi possible d'y applique un autre traitement si le test est ''faux''. Les tests peuvent s'écrire sous deux formes différents : longue et courte.
=== Forme longue ===
if [ "$VAR" == "A" ]
then
echo "VAR est égal à A"
else
echo "VAR est différent de A"
fi
=== Forme courte ===
[ "$VAR" == "A" ] && echo "VAR est égal à A" || echo "VAR est différent de A"
Dans la forme courte, ''&&'' correspond à ''then'' et ''||'' à ''else''.
=== elif ===
On peut aussi ajouter d'autres conditions après une vérification vrai (''then'') et avant une vérification fausse (''else''). Ces nouvelles conditions sont introduites par ''elif'' selon le format :
if [ "$VAR" == "A" ]
then
echo "VAR est égal à A"
elif [ "$VAR" == "B" ]
then
echo "VAR est égal à B"
elif [ "$VAR" == "C" ]
then
echo "VAR est égal à C"
# ---- Il peut y avoir autant de conditions elif que l'on souhaite ----
else
echo "VAR est différent de A, B, C, etc..."
fi
==== case, esac ====
''case'' permet d'appliquer un traitement selon la valeur testée.
AGE=1
case $AGE in
1)
echo "Age = 1"
;;
2)
echo "Age = 2"
;;
3|4)
echo "Age = 3 ou 4"
;;
*)
echo "Age incertain"
;;
esac
Chaque valeur de comparaison est indiqué avant un '')''. Si plusieurs valeurs correspondent au même bloc d'instruction, elles doivent être sur la même ligne, séparées par ''|'' et le tout suivit de '')''. Chaque bloc d'instruction doit toujours être terminée par '';;''. En dernière valeur, on peut donner ''*)'' qui symbolise le traitement par défaut.
~~DISCUSSION~~