Les bases de la programmation shell #Bigboss
Les Conditions :le if (Si)
if [ test ] #####Si test de la variable then ######Alors echo "C'est vrai" ####Renvoi si c'est Vrai fi #### Il délimite la fin du Si seulement si le Vrai est vérifié
ATTENTION au espaces a l’intérieur des crochets …
Petit test :
#!/bin/bash nom="RAREC3" if [ $nom = "RAREC3" ] then echo "Les meilleurs sont les RARE C3!" fi
Avec 2 variables
#!/bin/bash nom1="RAREC3" nom2="RAREC3" if [ $nom1 = $nom2 ] then echo "Vive les RARE !" fi
Quand la condition n’est pas remplie on fait comme ceci :
if [ test ] ###SI then ####Alors echo "C'est vrai" else ####Sinon echo "C'est faux" fi
#!/bin/bash nom="RAREC3" if [ $nom = "RAREC3" ] then echo "Vive les RAREC3!" else echo "Dégages t'es pas un RAREC3 !" fi
On peut charger la variable comme ca pour tester… :
#!/bin/bash if [ $1 = "RAREC3" ] then echo "Vive les RAREC3!" else echo "Dégages t'es pas un RAREC3 !" fi
./monscript RAREC3 ###### pour tester
./monscript autre chose ###### la il fera le sinon
On peut ensuite faire comme ca :
#!/bin/bash if [ $1 = "RAREC3" ] then echo "Vive les RAREC3!" elif [ $1 = "Tontonfred" ] then echo "Hello Tontonfred" elif [ $1 = "RAREC4" ] then echo "Alors les nouveaux ca va ?" else echo "Z'êtes pas du CESI bye!" fi
Utilisons maintenant les TESTS
Il est possible d’effectuer trois types de tests différents en bash :
- des tests sur des chaînes de caractères ;
- des tests sur des nombres ;
- des tests sur des fichiers.
Tests sur les Chaines de caractères:
Condition | Signification |
---|---|
$chaine1 = $chaine2 | Vérifie si les deux chaînes sont identiques. Notez que bash est sensible à la casse : « b » est donc différent de « B ». Il est aussi possible d’écrire « == » pour les habitués du langage C. |
$chaine1 != $chaine2 | Vérifie si les deux chaînes sont différentes. |
-z $chaine | Vérifie si la chaîne est vide. |
-n $chaine | Vérifie si la chaîne est non vide. |
#!/bin/bash if [ -z $1 ] then echo "Pas de paramètre" else echo "Paramètre présent" fi
Test sur les Nombres:
Condition | Signification |
---|---|
$num1 -eq $num2 | Vérifie si les nombres sont égaux (equal). À ne pas confondre avec le « = » qui, lui, compare deux chaînes de caractères. |
$num1 -ne $num2 | Vérifie si les nombres sont différents (non equal). Encore une fois, ne confondez pas avec « != » qui est censé être utilisé sur des chaînes de caractères. |
$num1 -lt $num2 | Vérifie si num1 est inférieur ( < ) à num2 (lower than). |
$num1 -le $num2 | Vérifie si num1 est inférieur ou égal ( <= ) à num2 (lower or equal). |
$num1 -gt $num2 | Vérifie si num1 est supérieur ( > ) à num2 (greater than). |
$num1 -ge $num2 | Vérifie si num1 est supérieur ou égal ( >= ) à num2 (greater or equal). |
#!/bin/bash if [ $1 -ge 20 ] then echo "Vous avez envoyé 20 ou plus" else echo "Vous avez envoyé moins de 20" fi
Test sur les fichiers:
-e $nomfichier | Vérifie si le fichier existe. |
-d $nomfichier | Vérifie si le fichier est un répertoire. N’oubliez pas que sous Linux, tout est considéré comme un fichier, même un répertoire ! |
-f $nomfichier | Vérifie si le fichier est un… fichier. Un vrai fichier cette fois, pas un dossier. |
-L $nomfichier | Vérifie si le fichier est un lien symbolique (raccourci). |
-r $nomfichier | Vérifie si le fichier est lisible (r). |
-w $nomfichier | Vérifie si le fichier est modifiable (w). |
-x $nomfichier | Vérifie si le fichier est exécutable (x). |
$fichier1 -nt $fichier2 | Vérifie si fichier1 est plus récent que fichier2 (newer than). |
$fichier1 -ot $fichier2 | Vérifie si fichier1 est plus vieux que fichier2 (older than). |
#!/bin/bash read -p 'Entrez un répertoire : ' repertoire if [ -d $repertoire ] then echo "Bien, vous avez compris ce que j'ai dit !" else echo "Vous n'avez rien compris..." fi
Recap plus infos complémentaires:
Tests sur les fichiers/répertoires
Voici une liste des tests possibles sur les fichiers et/ou répertoires :
- “-e fichier” : vrai si le fichier/répertoire existe.
- “-s fichier” : vrai si le fichier à une taille supérieure à 0.
- “-r fichier” : vrai si le fichier/répertoire est accessible en lecture.
- “-w fichier” : vrai si le fichier/répertoire est accessible en écriture.
- “-x fichier” : vrai si le fichier est exécutable ou si le répertoire est accessible.
- “-O fichier” : vrai si le fichier/répertoire appartient à l’utilisateur.
- “-G fichier” : vrai si le fichier/répertoire appartient au groupe de l’utilisateur.
- “-b nom” : vrai si nom représente un périphérique (pseudo-fichier) de type bloc (disques et partitions de disques généralement).
- “-c nom” : vrai si nom représente un périphérique (pseudo-fichier) de type caractère (terminaux, modems et port parallèles par exemple).
- “-d nom” : vrai si nom représente un répertoire.
- “-f nom” : vrai si nom représente un fichier.
- “-L nom” : vrai si nom représente un lien symbolique.
- “-p nom” : vrai si nom représente un tube nommé.
- “fichier1 -nt fichier2” : vrai si les deux fichiers existent et si fichier1 est plus récent que fichier2.
- “fichier1 -ot fichier2” : vrai si les deux fichiers existent et si fichier1 est plus ancien que fichier2.
- “fichier1 -ef fichier2” : vrai si les deux fichiers représentent un seul et même fichier.
Tests sur les entiers
- “entier1 -eq entier2” : vrai si entier1 est égal à entier2.
- “entier1 -ge entier2” : vrai si entier1 est supérieur ou égal à entier2.
- “entier1 -gt entier2” : vrai si entier1 est strictement supérieur à entier2.
- “entier1 -le entier2” : vrai si entier1 est inférieur ou égal à entier2.
- “entier1 -lt entier2” : vrai si entier1 est strictement inférieur à entier2.
- “entier1 -ne entier2” : vrai si entier1 est différent de entier2.
Tests sur les chaines de caractères
Les chaines doivent être entourées par des guillemets.
- “-n “chaîne”” : vrai si la chaîne n’est pas vide.
- “-z “chaîne”” : vrai si la chaîne est vide.
- “”chaine1” = “chaine2″” : vrai si les deux chaînes sont identiques.
- “”chaine1” != “chaine2″” : vrai si les deux chaînes sont différentes.
Les combinaisons de tests
Les combinaisons de tests sont utilisées quand on doit faire plusieurs tests simultanément, c’est à dire, quand on doit répondre à plusieurs conditions.
On utilise les opérateurs && et || comme dans les commandes composées. L’opérateur ! sert à inverser la condition.
- SI test ALORS commandes FIN : exécute les commandes si test est VRAI
- SI ! test ALORS commandes FIN : exécute les commandes si test est FAUX
- SI test1 && test2 ALORS commandes FIN : exécute les commandes si test1 ET test2 sont vrais tous les deux
- SI test1 -a test2 ALORS commandes FIN : pareil de précédemment, avec une autre notation
- SI test1 && ! test2 ALORS commandes FIN : exécute les commandes si test1 est VRAI ET test2 est FAUX
- SI test1 || test2 ALORS commandes FIN : exécute les commandes si test1 OU test2 sont VRAIS
- SI test1 -o test2 ALORS commandes FIN : pareil de précédemment, avec une autre notation
- SI ! { test1 || test2 } ALORS commandes FIN : exécute les commandes si NI test1 NI test2 sont VRAIS
EXERCICES
Le script demande une note ,et il renvoi ceci :
- “Autiste” si la note est entre 16 et 20
- “A” lorsqu’elle est entre 14 et 16
- “B” si la note est entre 12 et 14
- “C” si la note est entre 10 et 12
- “D” si la note est inférieur à 10
Les variables utilisateur
Ce chapitre présente les fonctionnalités qui composent les bases de la programmation shell.
Le shell permet de définir ou redéfinir des variables qui conditionnent l’environnement de travail de l’utilisateur. Il est également possible de définir d’autres variables, dites variables utilisateur, qui vont permettre de stocker des informations qui seront nécessaires durant l’exécution d’un script.
1. Nommer une variable
Voici les règles à utiliser pour attribuer un nom à une variable :
- le premier caractère fait partie de l’ensemble [a-zA-Z_] ;
- les caractères suivants sont pris dans l’ensemble [a-zA-Z0-9_].
2. Définir une variable
Une variable est définie dès qu’elle est initialisée. Le contenu d’une variable est considéré par le shell comme une suite de caractères.
a. Affecter une chaîne de caractères à une variable
Exemples
$ var1=mot1 $ echo $var1 mot1 $
Il ne faut pas mettre d’espace autour du symbole d’affectation : dans l’exemple suivant, le shell interprète var1 comme la commande à lancer, = et mot1 comme les deux arguments de la commande var1. Autrement dit, il n’interprète pas le signe = comme symbole d’affectation.
b. Affecter une chaîne de caractères contenant au moins un espace
L’espace doit être protégé car c’est un caractère spécial du shell (séparateur de mots sur la ligne de commande).
Exemples
$ var2=’mot1 mot2 mot3’ #CORRECT $ echo $var2 mot1 mot2 mot3 $ var2=mot1 mot2 mot3 #INCORRECT ksh: mot2: not found $
c. Variable indéfinie
Une variable qui n’a jamais été initialisée est vide.
L’utilisation d’une variable vide n’est pas considérée comme une erreur en shell.
Exemple
$ echo $vide $
d. Retirer la définition d’une variable
La commande interne unset permet de retirer la définition d’une variable.
Exemple
Définition d’une variable var :
$ var=12 $ echo $var 12
Elle apparaît dans la liste des variables définies au niveau du shell :
$ set | grep var var=12
La définition de la variable est retirée :
$ unset var
La variable est indéfinie :
$ echo $var $ set | grep var $
e. Isoler le nom d’une variable
Il faut faire attention en concaténant le contenu d’une variable et d’une chaîne de caractères à ce que le shell interprète correctement le nom de la variable.
Exemple
Pour le shell, le caractère _ fait partie du nom de la première variable :
$ fic=resu $ datejour=20110117 $ newfic=$fic_$datejour $ echo $newfic 20110117
Pour le shell, la première variable se nomme fic_ (puisque le caractère souligné est autorisé à l’intérieur d’un nom de variable !). Celle-ci est donc substituée par sa valeur (donc vide !), puis concaténée avec le contenu de la variable datejour.
Pour faire comprendre au shell quels sont les caractères qui font partie du nom de la variable, il faut entourer le nom de cette dernière avec des {}.
Exemple
$ fic=resu $ datejour=20110117 $ newfic=${fic}_$datejour $ echo $newfic resu_20110117
3. Substitution de variables
Le shell offre la possibilité d’attribuer une valeur par défaut aux variables non initialisées, ou au contraire, initialisées.
Expression ${variable:-valeur}
- Si la variable n’est pas vide, l’expression est substituée par le contenu de celle-ci.
- Si la variable est vide, l’expression est substituée par valeur.
Exemple
$ fic=/tmp/christie.log $ echo "Le fichier traite sera: ${fic:-/tmp/default.log}" Le fichier traite sera: /tmp/christie.log $ unset fic $ echo "Le fichier traite sera: ${fic:-/tmp/default.log}" Le fichier traite sera: /tmp/default.log $ echo $fic $
Expression ${variable:=valeur}
- Si la variable n’est pas vide, l’expression est substituée par $variable.
- Si la variable est vide, variable est affectée avec valeur et l’expression est substituée par valeur.
Exemple
$ fic=/tmp/christie.log $ echo "Le fichier traite sera: ${fic:=/tmp/default.log}" Le fichier traite sera: /tmp/christie.log $ echo $fic /tmp/christie.log $ unset fic $ echo "Le fichier traite sera: ${fic:=/tmp/default.log}" Le fichier traite sera: /tmp/default.log $ echo $fic /tmp/default.log $
Expression ${variable:+valeur}
- Si la variable n’est pas vide, l’expression est substituée par valeur.
- Si la variable est vide, l’expression est substituée par $variable, donc vide.
Exemple
$ a=1 $ echo "Expression : ${a:+99}" Expression : 99 $ unset a $ echo "Expression : ${a:+99}" Expression : $
${variable:?message}
- Si la variable n’est pas vide, l’expression est substituée par $variable.
- Si la variable est vide, le shell affiche le nom de la variable suivie de la chaîne de caractères message.
Si la variable est vide et que cette commande est placée dans un script shell, celui-ci affiche le message et se termine immédiatement.
Exemple
La variable var est vide :
$ echo $var $ echo ${var:?"var non definie"} bash: var: var non definie
Message par défaut :
$ echo ${var:?} bash: var: parameter null or not set
Définition de la variable var :
$ var=definie $ echo ${var:?"var non definie"} definie $
Sources :Eni .Site du Zéro