====== Linux ======
===== Les contrôles booléens =====
\\ 
==== La commande 'test' ====
La commande ''test'' est une commande. À ce titre, ''test'' renvoie donc un statut vrai ou faux. Mais cette commande n'affiche rien à l'écran. Il faut donc, pour connaître le résultat d'un test, vérifier le contenu de la variable  **$?**.
  * **Test sur les fichiers**
test option "fichier"
^Option ^Signification ^
|-s |fichier "non vide" |
|-f |fichier "ordinaire" |
|-d |fichier "répertoire" |
|-b |fichier "spécial" mode "bloc" |
|-c |fichier "spécial" mode "caractère" |
|-p |fichier "tube" |
|-L |fichier "lien symbolique" |
|-h |fichier "lien symbolique" (identique à « -L ») |
|-r |fichier a le droit en lecture |
|-w |fichier a le droit en écriture |
|-x |fichier a le droit en exécution |
|-u |fichier a le "setuid" |
|-g |fichier a le "setgid" |
|-k |fichier a le "sticky bit" |
|-t [n] |fichier n°[n] est associé à un terminal (par défaut, [n] vaut 1) |
^  //Réservé au Ksh / Bash//  ^^
|-S |fichier "socket" |
|-e |fichier existe quel que soit son type |
|-O |fichier m'appartient |
|-G |fichier appartient à mon groupe |
|-N |fichier modifié depuis sa dernière lecture |
\\ 
  * **Test sur les chaînes de caractères**
test "fichier1" option "fichier2"
^Option ^Signification ^
|-z |chaîne de longueur nulle |
|-n |chaîne de longueur non nulle |
|= |chaîne1 identique à chaîne2 |
|!= |chaîne1 différente de chaîne2 |
Exemples :
$ var="1A" 
$ [[ $var =~ ^[0-9]*$ ]]            #renvoie faux
$ [[ $var =~ ^[0-9] ]]              #renvoie vrai
$ [[ $var =~ [A-Z]{1} ]]            #renvoie vrai
$ [[ $var =~ ^[0-1]{1}[A-Z]{1}$ ]]  #renvoie vrai
\\ 
  * **Test sur les valeurs numériques**
test nb1 option nb2
^Option ^Signification ^
|-eq |nb1 égal à nb2 (equal) |
|-ne |nb1 différent de nb2 (non equal) |
|-lt |nb1 inférieur à nb2 (less than) |
|-le |nb1 inférieur ou égal à nb2 (less or equal) |
|-gt |nb1 supérieur à nb2 (greater than) |
|-ge |nb1 supérieur ou égal à nb2 (greater or equal) |
Exemples :
$ test "5" = "05"     #Renvoie "faux" (ce qui est mathématiquement incorrect) 
$ test "5" -eq "05"   #Renvoie "vrai" (correct)
\\ 
  * **Connecteurs logiques**
Les connecteurs permettent de composer des expressions plus complexes.
^Option ^Signification ^
|-a |"ET" logique |
|-o |"OU" logique |
|!  |"NOT" logique |
|(...) |Groupement d'expressions\\ (doit être protégé de backslashes pour ne pas que le shell l'interprète comme une demande de création de sous-shell) |
Exemple : Vérifie si l'année courante est bissextile (divisible par 4, mais pas par 100 ; ou divisible par 400)
$ y=`date '+%Y'`                # Récupère l'année courante dans la variable "y" 
$ test \( `expr $y % 4` -eq 0 ?a `expr $y % 100` -ne 0 \) ?o `expr $y % 400` -eq 0
\\ 
==== Les commandes 'true' et 'false' ====
Les commandes ''true'' et ''false'' n'ont d'autre but que de renvoyer un état respectivement à "vrai" ou "faux".
Exemples :
$ true      # La commande renvoie la valeur "vrai" 
$ echo $? 
0 
$ false     # La commande renvoie la valeur "faux" 
$ echo $? 
1