====== Linux ======
===== Structure conditionnelle - IF =====
\\
==== Syntaxe ====
# un IF simple
if [ test ]
then
echo "le test est passé"
fi
# et avec un ELSE IF et un ELSE
if [ test ]
then
echo "le test est passé"
elif [ test2 ]
echo "le test2 est passé"
else
echo "les deux tests ont échoué"
fi
\\
==== Syntaxes conditionnelles [ ] ====
Ce sont les conditions compatibles avec sh.
* **Conditions sur les fichiers**
if [ -f ceci_est_un_fichier ]
then
echo "il s'agit bien d'un fichier"
fi
* **Conditions sur les strings**
if [ -z "$variable_vide" ]
then
echo "la variable est bien vide"
fi
# comparaison
if [ "$variable" == "ta mère" ]
then
echo "la variable contient la chaîne ta mère"
fi
* **Conditions arithmétiques**
if [ $num -lt 1 ]
then
echo "la variable est inférieure à 1"
fi
if [ $num -eq 100 ]
then
echo "la variable est égale à 100"
fi
\\
==== Syntaxes conditionnelles [[ ]] ====
Ces conditions permettent tout ce qu'offrent les conditions à simples crochets et plus. En revanche, elles ne sont pas compatibles avec sh.
Ces conditions améliorées proposent l'usage du //wildcard// comme en bash ainsi que des //expressions régulières//.
if [[ -z "$variable_vide" ]]
then
echo "la variable est bien vide"
fi
if [[ "$variable" == *superman* ]]
then
echo "la variable contient le mot superman"
fi
if [[ "$variable" == superman* ]]
then
echo "la variable commence par le mot superman"
fi
if [[ "$variable" == [sS]uperman* ]]
then
echo "la variable commence par le mot superman ou Superman"
fi
if [[ "$email" =~ "b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}b" ]]
then
echo "la variable contient un email valide"
fi
\\
==== Syntaxes conditionnelles arithmétiques (( )) ====
Cette syntaxe dédiée aux comparaisons arithmétiques peut sembler plus familière, car elle autorise les opérateurs plus connus dans d'autres langages : ''=='', ''!='', ''<'' et ''>''. Elle supporte aussi les opérateurs ''&&'' et ''||''.
if (( $a != 0 ))
then
echo "$a est non nul"
fi
\\
==== Table des conditions ====
=== Conditions sur les fichiers ===
^Condition ^Vrai si ^Détails ^
|[ **-a** fichier ] |'fichier' existe et est un fichier. |- |
|[ **-b** blockspecialfile ] |Le fichier "blockspecialfile" existe et est de type bloc spécial. |Les "block special files" (fichier spécial en mode bloc) sont des fichiers qui représentent des périphériques, souvent des disques durs ou clefs USB. On les trouve principalement dans /dev ex. /dev/sda (disque a) et /dev/sda1 (partition 1 du disque a). |
|[ **-c** charspecfile ] |Le fichier "charspecfile" existe et est de type caractère spécial. |Les "character special files" sont des fichiers spéciaux du kernel, différents des "block special files". Ils ne sont pas mis en mémoire tampon, buffered, leur effet est immédiat : envoi du caractère au driver correspondant (émission d'un son via la carte son, etc.). Ce type de fichier concerne aussi les pseudo-périphériques (pseudo-devices) /dev/null, /dev/zero, /dev/full, /dev/random et /dev/urandom. |
|[ **-d** dossier ] |'dossier' existe et est un dossier. |- |
|[ **-e** fichier ] |Même comportement que -a. |- |
|[ **-f** fichier ] |'fichier' existe. |Le fichier n'est ni de type bloc spécial, ni de type caractère spécial. |
|[ **-h** lien_symbolique ] |'lien_symbolique' existe et est un lien symbolique. |- |
|[ **-L** lien_symbolique ] |Même comportement que -h. |- |
|[ **-r** fichier_lisible ] |'fichier_lisible' existe et est lisible par le script. |- |
|[ **-s** fichier_non_vide ] |'fichier_non_vide' existe et possède une taille non nulle. |- |
|[ **-w** fichier_writable ] |'fichier_writable' existe et le script peut y écrire. |- |
|[ **-x** executable ] | 'executable' existe et est exécutable depuis le script. |Concernant un répertoire, le droit d'exécution permet simplement de lister son contenu. |
=== Conditions sur les chaînes de caractères ===
^Condition ^Vrai si ^
|[ $chaine1 **==** $chaîne2 ]\\ [ $chaine1 **!=** $chaîne2 ] | Vérifie la similarité des chaînes |
|[ "abc" **<** "bcd" ]\\ [ "abc" **>** "bcd" ] |par ordre alphabétique, "abc" se trouve avant "bcd". Donc TRUE.\\ Ici, FALSE |
|[ **-n** "string_non_vide" ] |"string_non_vide" n'est pas vide ?
|[ **-z** "string_vide" ] |"string_vide" est vide ?
=== Conditions sur les entiers ===
^Condition ^Vrai si ^
|[ nb1 **-eq** nb_2 ] |pour //equal//, égal. |
|[ nb1 **-ne** nb2 ] |pour //not equal//, non égal. |
|[ nb1 **-gt** nb2 ] |pour //greater than//, plus grand que. |
|[ nb1 **-ge** nb2 ] |pour //greater than// or //equal//, plus grand ou égal. |
|[ nb1 **-lt** nb2 ] |pour //less than//, plus petit. |
|[ nb1 **-le** nb2 ] |pour //less than or equal//, plus petit ou égal. |
\\
----
===== Structure conditionnelle - CASE =====
case chaine in
val1)
commande1
[ commande2 ?]
;;
[val2)
commande3
[ commande4 ?]
;;]
esac
Les valeurs de choix peuvent utiliser les constructions suivantes :
^Construction ^Signification ^
|[x-y] |La valeur correspond à tout caractère compris entre "x" et "y" |
|[xy] |La valeur testée correspond à "x" ou "y" |
|xx%%|%%yy |La valeur correspond à deux caractères "xx" ou "yy" |
|? |La valeur testée correspond à un caractère quelconque |
|* |La valeur testée correspond à toute chaîne de caractères (cas "autres cas") |
Exemple : Script qui fait saisir un nombre et qui évalue ensuite s'il est pair, impair, compris entre 10 et 100 ou autre chose.
#!/bin/sh
# Script de saisie et d'évaluation simple du nombre saisi
# Saisie du nombre
echo "Entrez un nombre"
read nb
# Évaluation du nombre
case $nb in
0) echo "$nb vaut zéro";;
1|3|5|7|9) echo "$nb est impair";;
2|4|6|8) echo "$nb est pair";;
[1-9][0-9]) echo "$nb est supérieur ou égal à 10 et inférieur à 100";;
*) echo "$nb est un nombre trop grand pour être évalué"
esac