Skip to content

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 {[[[([[]#]#[[#][#~]])]]]}

Commentaires