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
$
PUCE.png

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.

p128.png

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.

PUCE.png

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.
PUCE.png

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

 

www.pdf24.org    Envoyer l'article en PDF   
Posted on: 1 novembre 2015tontonfred