====== 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