# 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
Ce sont les conditions compatibles avec sh.
if [ -f ceci_est_un_fichier ] then echo "il s'agit bien d'un fichier" fi
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
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
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
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
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. |
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” ] |
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. |
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