Outils pour utilisateurs

Outils du site


linux:shell:structures_controle:if

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” ]
[ -z “string_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

linux/shell/structures_controle/if.txt · Dernière modification : 2022/07/20 14:11 de zandor