Généralité¶
Les variables¶
3 types de variables¶
- Variables utilisateur : Ce sont les variables que le développeur définit de manière locale dans son programme
- Variables d'environnement : Ce sont des variables définies de manière globales et qui sont utilisables dans différents programmes
- Paramètres de position : À l'appel d'un script, ce sont les arguments passés en paramètres sur la ligne de commandes
Affectation¶
Opérateur =
#!/bin/bash # Affectation var1=1 var2=2
Warning
L'affectation via l’opérateur = est une commande "variable=valeur"Il n'y a donc pas d'espaces entre le nom de la variable, l'opérateur et la valeur
Identification¶
En bash une variable est indentifiée par un nom, c'est à dire une suite de lettre. elle peut contenir une des chiffres ou des caractères "souligné" mais ne peut commencer par un chiffre.
# Bien maVariable="Un nom de variable correct" ma_variable="Un nom de variable correct" var1="Un nom de variable correct" # Pas bien c'est quoi ce nom="Un nom de variable incorrect" 123soleil="Un nom de variable incorrect"
Important
Les variables sous bash ne sont pas typés ! Les variables sont stockées sous forme de chaîne de caractères.
Substitution de variable¶
Pour appeler une variables et obtenir sa valeur, il faut placé un $
devant sza référence.
#affectation Prenom=Anas #substitution echo "$Prenom est un prénom original..."
Simples et doubles quotes¶
- Les doubles quotes (guillemets partiels ou protection faibles) permettent de grouper des mots sans annuler le remplacement des variables :
#affectation Prenom=Anas #substitution echo "$Prenom est un prénom original..." #affichage Anas est un prénom original...
- Les simples quotes (Guillemets complets ou protection forte) permettent de grouper des mots et annulent toute évaluation :
#affectation Prenom=Anas #substitution echo '$Prenom est un prénom original...' #affichage $Prenom est un prénom original...
Délimitation¶
Les variables d'environnement sont des variables globales qui permettent de définir des valeurs pouvant être utilisées dans n'importe quel programme exécuté dans le même environnement.
La liste des variables d'environnement est donnée par la commande env
Comme pour les Les accolades ${variable} permettent de délimiter le nom d'une variable.
cash="15" echo "Montant : $cash0 Euro" Montant : Euro echo "Montant : ${cash}0 Euro" Montant : 150 Euro
Substitution de commandes¶
Affectation du résultat d'une commande dans une variable : $(commande)
repCourant=$(pwd) echo "Vous êtes dans le répertoire $repCourant" Vous êtes dans le répertoire /home/joda nbProcesseur=$(cat /proc/cpuinfo | grep ^processor | wc -l) echo "Le nombre de processeur s'élève à $nbProcesseur" Le nombre de processeur s'élève à 6
Affectation par lecture¶
La commande read
permet d'affecter une ou des valeurs à une ou des variables.
read var1 var2 valeur1 valeur2 echo "La première valeur saisie est : $var1" La première valeur saisie est : valeur1 echo "La seconde valeur saisie est : $var2" La seconde valeur saisie est : valeur2 BASH $>
!!! note Si il y a moins de variables que de mots saisis, le BASH affecte à la dernière variable tous les mots non affectés.Si il y a plus de variables que de mots saisis, le BASH affecte une chaîne vide aux variables non utilisées.Si il n'y a pas de variables en paramètre, la ligne lue est enregistrée dans la variable prédéfinie : REPLY
Les paramètres optionnels
- ***-p** 'Texte' *: Affiche une chaine d'appel
- -s : N'affiche pas ce que l'utilisateur saisi
- -n val : Limite le nombre de caractère
- -t val : Limite la saisie au temps indiqué en seconde
Les variables d'environnement¶
Accéder aux valeurs
Les variables d'environnement sont des variables globales qui permettent de définir des valeurs pouvant être utilisées dans n'importe quel programme exécuté dans le même environnement.
La liste des variables d'environnement est donnée par la commande env
Tests, boucles et conditions¶
les branchements conditionnels¶
le 'if'¶
syntax : si... [[OU SI...][SINON...]]
#!/bin/bash stVal="Bruno" # Branchement conditionnel if [ $stVal == "Bruno" ]; then # Premier bloc d'instructions echo "Salut Bruno !" elif [ $stVal == "Michel" ]; then # Deuxième bloc d'instructions echo "Bien le bonjour Michel" elif [ $stVal == "Jean" ]; then # Troisième bloc d'instructions echo "Hé Jean, ça va ?" else # Bloc d'instructions par défaut echo "J'te connais pas, ouste !" fi
Branchement conditionnel : Le "if"
Un branchement conditionnel de la forme SI ... [[OU SI ...] [SINON ...]] permet de déterminer, selon le résultat de l'expression logique (vrai ou faux) renvoyé par le prédicat, quel bloc d'instructions sera exécuté.
#!/bin/bash stVal="Bruno" # Branchement conditionnel if [ $stVal == "Bruno" ]; then # Premier bloc d'instructions echo "Salut Bruno !" elif [ $stVal == "Michel" ]; then # Deuxième bloc d'instructions echo "Bien le bonjour Michel" elif [ $stVal == "Jean" ]; then # Troisième bloc d'instructions echo "Hé Jean, ça va ?" else # Bloc d'instructions par défaut echo "J'te connais pas, ouste !" fi
REMARQUEIl peut y avoir un nombre quelconque de elif et le dernier else est toujours facultatif
Branchement multiple : Le "case"
Un branchement multiple permet de déterminer si la valeur sur laquelle ce branchement est effectué est égale à l'une des constantes.
Dans le cas d'une correspondance, le bloc d'instructions associé à cette constante sera exécuté, sinon le BASH exécutera le bloc d'instructions correspondant à la constante par défaut, symbolisée par *).
#!/bin/bash stVal="Jean" case $stVal in "Bruno") # Premier bloc d'instructions echo "Salut Bruno !" ;; "Michel") # Deuxième bloc d'instructions echo "Bien le bonjour Michel" ;; "Jean") # Troisième bloc d'instructions echo "Hé Jean, ça va ?" ;; *) # Bloc d'instructions par défaut echo "J'te connais pas, ouste !" ;; esac REMARQUEIl peut y avoir un nombre quelconque de constante et celle par défaut est facultative
Les boucles¶
La boucle While
Dans une boucle while, tant que le test est vérifié, le bloc d'instructions est exécuté. Si dès le départ le test n'est pas vérifié, le bloc d'instructions ne sera jamais exécuté.
#!/bin/bash i=0 while [ $i -lt "10" ]; do # Bloc d'instructions ((i++)) echo $i done
La boucle For (1)
Dans une boucle for ... in, le bloc d'instructions est exécuté autant de fois qu'il y a de valeurs en entrée. À chaque itération, le bloc d'instructions s’exécutera avec chacune des valeurs.
#!/bin/bash vals='/mnt /dev /proc /sys /tmp /usr/bin /var/tmp' for i in $vals; do # Bloc d'instructions echo $i # 1er Passage avec "/mnt", 2ème avec "/dev", 3ème avec "/proc"... done
La boucle For (2)
Dans une boucle for, le bloc d'instructions est exécuté tant qu'il y a de valeurs générées respectant la condition. À chaque itération, le bloc d'instructions s’exécutera avec chacune de ces valeurs.
#!/bin/bash for ((i = 10; i >= 0; i -= 1)); do # Bloc d'instructions echo $i done
IFS (Internal Field Separator)
Lors de l’exécution d'une boucle for ... in, le BASH utilise la valeur de la variable IFS (espace, tabulation, retour à la ligne) pour isoler dans la chaîne d'entrée chacun des éléments constituants de la boucle.
BASH $> vals='/mnt /dev /proc /sys /tmp /usr/bin /var/tmp'BASH $> for i in $vals; do echo $i; done/mnt/dev/proc/sys/tmp/usr/bin/var/tmpBASH $>
Dans certains cas, un problème survient quand le flux de donnée doit contenir un espace.
BASH $> vals='/mnt /dev /proc /sys /tmp /usr/bin /home/joda/Mes Documents'BASH $> for i in $vals; do echo $i; done/mnt/dev/proc/sys/tmp/usr/bin/home/joda/MesDocumentsBASH $>
La solution consiste a changer la valeur de la variable IFS avec un caractère choisit. Par exemple dans le cas de nom de fichier ou de répertoire, il est plus approprier de séparer la liste avec une virgule.
BASH $> IFS=$','BASH $> vals='/mnt,/dev,/proc,/sys,/tmp,/usr/bin,/home/joda/Mes Documents'BASH $> for i in $vals; do echo $i; done/mnt/dev/proc/sys/tmp/usr/bin/home/joda/Mes DocumentsBASH $> unset IFSBASH $> ATTENTIONIl ne faut pas oublier de réinitialiser la variable IFS avec la commande unset pour qu'elle retrouve sa valeur par défaut. En effet le changement de valeur de cette variable pourrait impacter le reste de votre script**La boucle For (1)**
Dans une boucle for ... in, le bloc d'instructions est exécuté autant de fois qu'il y a de valeurs en entrée. À chaque itération, le bloc d'instructions s’exécutera avec chacune des valeurs.
#!/bin/bash vals='/mnt /dev /proc /sys /tmp /usr/bin /var/tmp' for i in $vals; do # Bloc d'instructions echo $i # 1er Passage avec "/mnt", 2ème avec "/dev", 3ème avec "/proc"... done
La boucle For (2)
Dans une boucle for, le bloc d'instructions est exécuté tant qu'il y a de valeurs générées respectant la condition. À chaque itération, le bloc d'instructions s’exécutera avec chacune de ces valeurs.
#!/bin/bash for ((i = 10; i >= 0; i -= 1)); do # Bloc d'instructions echo $i done
IFS (Internal Field Separator)
Lors de l’exécution d'une boucle for ... in, le BASH utilise la valeur de la variable IFS (espace, tabulation, retour à la ligne) pour isoler dans la chaîne d'entrée chacun des éléments constituants de la boucle.
BASH $> vals='/mnt /dev /proc /sys /tmp /usr/bin /var/tmp'BASH $> for i in $vals; do echo $i; done/mnt/dev/proc/sys/tmp/usr/bin/var/tmpBASH $>
Dans certains cas, un problème survient quand le flux de donnée doit contenir un espace.
BASH $> vals='/mnt /dev /proc /sys /tmp /usr/bin /home/joda/Mes Documents'BASH $> for i in $vals; do echo $i; done/mnt/dev/proc/sys/tmp/usr/bin/home/joda/MesDocumentsBASH $>
La solution consiste a changer la valeur de la variable IFS avec un caractère choisit. Par exemple dans le cas de nom de fichier ou de répertoire, il est plus approprier de séparer la liste avec une virgule.
BASH $> IFS=$','BASH $> vals='/mnt,/dev,/proc,/sys,/tmp,/usr/bin,/home/joda/Mes Documents'BASH $> for i in $vals; do echo $i; done/mnt/dev/proc/sys/tmp/usr/bin/home/joda/Mes DocumentsBASH $> unset IFSBASH $> ATTENTIONIl ne faut pas oublier de réinitialiser la variable IFS avec la commande unset pour qu'elle retrouve sa valeur par défaut. En effet le changement de valeur de cette variable pourrait impacter le reste de votre script
test :
double {[[[([[]#]#[[#][#~]])]]]}