Le nom d'une variable est un simple pointeur vers l'emplacement mémoire où sont conservées les données qu'elle contient.
Les variables qu'on crée dans un script (ou dans le terminal) sont localisées dans ce script (ou à l'ouverture d'un terminal) c'est-à-dire qu'elles ne sont utilisables que lorsqu'on exécute son script, (ou que l'on appelle la valeur d'une variable qu'on vient de déclarer dans un terminal). Et il s'agit du script d'un utilisateur, il faut les distinguer des variables de substitution prédéfinies et des variables d'environnement prédéfinies.
Mais comment enregistrer une valeur en mémoire ?
C'est par exemple, l'affectation d'une valeur au nom d'une variable qui va permettre d'enregistrer en mémoire cette variable avec sa valeur
Voyons d'abord comment créer une variable de cette manière et comment utiliser sa valeur.
La déclaration d'une variable se fait lors de son affectation, c'est-à-dire lorsqu'on assigne au nom de la variable une valeur au moyen du caractère = (sans espace avant et après).
#!/bin/bash nom_de_la_variable=ValeurDeLaVariable
La valeurValeurDeLaVariable
a été mémorisée.
Pour “utiliser” une variable, on se sert de sa valeur : il faut donc appeler sa valeur et cela se fait avec le caractère spécial $
accolé au nom de la variable :
#!/bin/bash nx_fichier=les-fonctions touch ~/$nx_fichier ls -la ~/$nx_fichier
Les programmes (ou commandes)touch
etls
ont utilisé la valeur de
la fonction nomméenx_fichier
, dont la valeur correspond à la chaîne
de caractèresles_fonctions
.
La valeur d'une variable peut être un nombre, un ou plusieurs caractères, du texte espacé, une commande, la valeur d'une variable.
#!/bin/bash var1=a var2=texte var3="texte avec espaces" var4=55 var5=$var1 #ici on affecte à la variable var5, la valeur de la variable var1 var6=$0 #ici on affecte à la variable var6, la valeur de la variable pré-définie $0 (1) echo -e "valeur de var1: $var1\nvaleur de var2: $var2\nvaleur de var3: $var3\nvaleur de var3: $var4\nvaleur de var5: $var5\nvar6: $var6"
(1) $0 a pour valeur pré-définie le nom du programme
valeur de var1: a valeur de var2: texte valeur de var3: texte avec espaces valeur de var3: 55 valeur de var5: a var6: /home/hypathie/MesScripts/mon-script
On peut déclarer plusieurs variables sur une même ligne, il suffit pour cela de mettre un espace entre chacune :
#!/bin/bash set -o posix var1=a var2=texte var3="texte avec espaces" var4=55 var5=$var1 var6=$0 /bin/echo -e "valeur de var1: $var1\nvaleur de var2: $var2\nvaleur de var3: $var3\nvaleur de var3: $var4\nvaleur de var5: $var5\nvar6: $var6" # même retour que précédemment
_
. Mais il ne doit jamais :
#!/bin/bash var1=lala var2=li var3=$var1$var2 echo $var3
On peut créer des variables au moyen de commandes, comme par exemple la commande read qui est une commande interne (ou primitive) au shell.
read nom_de_la_variable
Par exemple dans un script :
#!/bin/bash echo "Bonjour : qui êtes-vous ?" read nom echo "Enchanté $nom !"
#!/bin/bash read -p "entrez votre prénom: " prenom echo "bonjour $prenom !"
Iciprenom
est le nom de la variable, et sa valeur est entrée par l'utilisateur depuis le terminal.
Là aussi ces deux commandes peuvent être entrées dans le terminal.
read
permet de déclarer plusieurs variables successivement (dans terminal ou script):read -p "entrez votre nom et prénom: " nom prenom
entrez votre nom et prénom:
On entre par exemple les deux chaînes de caractères,debian
etfacile
, puis on peut récupérer la valeur de chacune des deux variablesnom
etprenom
.
echo $prenom $nom
facile debian
Mais dans un script c'est plus rapide !
#!/bin/bash read -p "entrez votre nom d'utilisateur: " echo "bonjour $USER !"
Ci-dessus, on n'a pas mis lenom
de la variable, parce qu'on ne cherchera pas
à utiliser la valeur de cette variable. Cela permet au programme de se poursuivre.
Quand on entre dans le terminal la réponse attendu parread
, le retour de la
commande est0
, donc elle est considérée comme exécutée, et le shell passe à
l'exécution de la commande suivante.
read
.-p
: afficher un message-n
: limiter le nombre de caractères-t
: limiter le temps autorisé pour saisir un message-s
: ne pas afficher le texte saisi
On peut utiliser plusieurs options.
Par exemple:
read -p "entrez votre année de naissance (deux derniers chiffres): " -n 2 annee
Pour modifier la valeur d'une variable, il suffit de l'affecter d'une nouvelle valeur.
#!/bin/bash var1=bonjour echo $var1 var1=23 echo $var1 var1= echo $var1 var1=Bonjour echo $var1
bonjour 23 Bonjour
On protège une variable avec la commande readonly
. La variable devient alors une variable en lecture seule. Cela lui donne la caractéristique d'être figée : on ne peut plus alors, au cours du même script, réaffectée par une nouvelle valeur une variable en lecture seule, y compris si cette variable a été déclarée nulle.
#!/bin/bash var1=toto var2= echo "$var1 $var2" readonly var1 var2 var1=titi var2=titi unset var1 var2
toto ligne6: var1 : variable en lecture seule ligne7: var2 : variable en lecture seule ligne 8 : unset: var1 : « unset » impossible : variable est en lecture seule ligne 8 : unset: var2 : « unset » impossible : variable est en lecture seule
Soit le script “essai.sh” : passons à ce script l'argument vous
#!/bin/bash var1=coucou var2=$1 echo "$var1 $var2" unset var2 echo "$var1 $var2" var1=$1 var2=vous echo "$var1 $var2" unset var2 echo "$var1 $var2"
#!/bin/bash var1=yep var2=coucou echo "$var1 $var2" unset var2 echo "$var1 $var2" echo " " echo "mais pour un paramètre :" echo " " var1=yep var2=coucou var3=$1 echo "$var1 $var2 $var3" unset var2 var3 echo "$var1 $var2 $var3" var2= var3=$1 echo "$var1 $var2 $var3"
yep coucou yep mais pour un paramètre : yep coucou yep yep
Exporter la valeur d'une variable signifie que l'on envoie à un processus fils, la valeur d'une variable depuis un processus père.
On peut exporter depuis le terminal, une valeur pour remplacer provisoirement une variable d'un script.
Coucou="Bonjour"
On déclare la variableCoucou
, affectée de la valeurBonjour
depuis le terminal.
Le shell courant l'a enregistré.
echo 'echo "Coucou=$Coucou"' > test.sh
Là, on crée le fichier “test.sh” contenant la ligne :echo “Coucou=$Coucou”
.
Il contient une variable, de même nom que celle, précédemment déclarée et affectée de la valeurBonjour
depuis le terminal.
chmod u+x test.sh
Le fichier “test.sh” devient exécutable pour l'utilisateur principal.
export Coucou
On exporte la variableCoucou
1).
Attention, ce n'est jamais la valeur d'une variable que l'on exporte !
./test.sh
Coucou="Bonjour"
Il faut que le script déclare une variable de même nom (Coucou=
) ; qu'il récupère celle exportée depuis le terminal ($Coucou
) ; et bien évidemment, qu'il affiche (echo
) tout cela :(echo “Coucou=$Coucou”
).
Dans ces conditions, la valeur de la variableCoucou
une fois exportée, peut valoir pour la variable du script “test.sh” qui est le processus fils du shell courant.
Mais une fois le terminal réinitialisé, si on lance ./test.sh, ce script est le
processus fils d'un “nouveau” processus père (= le nouveau terminal) qui n'a plus
en mémoire la valeurBonjour
pour la variable nulleCoucou
du script.
Et dans ce cas :
./test.sh
Coucou=
source ~/.bashrc
ou
. ~/.bashrc
Lorsqu'on ajoute un argument au script avant son exécution, on peut alors récupérer la valeur de ce paramètre.
(Par défaut, 0 quand tout s'est bien passé, 1 quand il y a une erreur, sinon on fait exit xx, $? affiche xx)
EXEMPLES : soit le script “essai.sh”
#!/bin/bash var=Bonjour echo $var echo "$1" echo "$2" echo "$3" echo "ou le paramètre 1 est: $1, le deuxième est: $2, le troisième est : $3" echo " " echo "tous les paramètres $@"
./essai.sh a b c
Bonjour # on peut récupérer une valeur (ou des valeurs) déclarée(s) et les paramètres de position a b c ou le paramètre 1 est: a, le deuxième est: b, le troisième est : c tous les paramètres a b c
#!/bin/bash echo $1 echo $* echo $@ echo $#
./essai.sh bonjour à tous
bonjour bonjour à tous bonjour à tous 3
#!/bin/bash echo $1 echo $* echo $@ echo $#
./essai.sh "bonjour à tous"
bonjour à tous bonjour à tous bonjour à tous 1
Pour plus de détails sur la commande set voir : script-bash-detail-sur-les-parametres-et-les-boucles
#!/bin/bash set "bonjour à tous" echo $* echo $@ echo $1 echo $#
./essai.sh
bonjour à tous bonjour à tous bonjour à tous 1
#!/bin/bash set bonjour à tous echo $* echo $@ echo $1 echo $#
./essai.sh
bonjour à tous bonjour à tous bonjour 3
#! /bin/bash Nombre_arguments_attendus=1 if [ $# -ne $Nombre_arguments_attendus ]; then echo "Le nombre d'arguments est invalide : $#" echo "Nombre argument attendu : ${Nombre_arguments_attendus} " fi #if [ "$#" -ne 1 ]; then # echo "Le nombre d'arguments est invalide" #fi echo "Script Started !"
./essai.sh
Script Started !
${#VAR}
.Exemples :
#!/bin/bash var="j'aime debian-facile" echo ${#var}
Permet de se servir de la sortie d'une commande dans un autre contexte pour ;
`commande`
OU
$(commande)
#!/bin/bash dir=$(pwd) echo "mon répertoire est : $dir"
mon répertoire est : /home/hypathie
#!/bin/bash echo $(pwd ; ls)
echo $( ls $(pwd)/Documents)
#!/bin/bash set $(pwd ; whoami) echo "$1 : $2" echo $#
Ou
#!/bin/bash set -- $(ls -l $(pwd)/.bashrc) echo $*
Comme nous l'avons vu on peut affecter une variable par différents types de valeurs ; des chaînes de caractères, des nombres, des valeurs d'autres variables, des substitutions de commandes.
On dit pour cela qu'en bash les variables ne sont pas typées.
Mais il peut être intéressant de typer une variable. Pour ce faire, il faut utiliser des commandes internes à bash qui permettent de déclarer une variable typée.
commandes | options |
---|---|
declare/typeset | -r : lecture seule |
declare/typeset | -i : entier |
declare/typeset | -a tableau (array) |
declare/typeset | -f : fonction(s) |
declare/typeset | -x : export |
declare/typeset | -x : var=$valeur |
Voir : Guide avancé d'écriture des scripts Bash: 9.4. Typer des variables : declare ou typeset
-i
de la commande declare
:declare -i nom[=expression] nom[=expression] …
#!/bin/bash declare -i x=35*2 echo $x
retour
70
-r
.#!/bin/bash declare -ir a=35*2 declare -ir b=5+5 echo $(($a+$b))
80
Méthode POSIX : Les commandes let
et (( ... ))
permettent de typer les variables pour effectuer des calculs sur les variables (synonyme de declare -i
).
Voir : les opérateurs arithmétiques
let 'var = 5 + 5' OU LE SHELL ARITHMÉTIQUE : $(( 5 * 3 ))
#!/bin/bash let "a = 10" let "b = 2" let "c = a+b" echo $c let "e = 10*2" echo $e let "f = 15" let "f *=2" echo $f echo " " let 'var = 5 + 5' echo "$var" echo " " echo $(( 20 + 20 )) var1="2" var2="5" echo $(( $var2 % $var1 ))
12 20 30 10 40 1
Voir les opérateurs d'affectation arithmétique
Cela consiste à affecter à une variable le résultat d'un calcul arithmétique, par la constante (donc avec let
) qu'on lui a donné.
Soit une variable var de valeur x, si l'on fait var +=2
alors la variable var sera x + 2
.
cela permet de faire des incrémentation par autre chose que 1.)
Il en va de même pour les autres opérateurs.
let "a = 5" let "b = 10" let "c = a *= 3" let "d = a += 3" # valeur précédente de a conservée pour calculer d : 15+3 =18 let "e = b /= 3" let "f = b /= 3" # valeur précédente de b conservée pour calculer f : 3/3 =1 echo "c=$c d=$d e=$e f=$f" # réponse : c=15 d=18 e=3 f=1 i=1 let "i += 7" echo "i=$i" # réponse : i=8 j=4 let "j *= 5" echo "j=$j" # réponse : j=20
(( var++ ))
; (( ++var ))
; (( var-- ))
, etc.#!/bin/bash let "var = 5" echo "$var" (( var++ )) echo "$var" (( var-- )) echo "$var"
Retour :
5 6 5
#!/bin/bash i=1 # on initialise le compteur while [ $i -le 10 ]; do echo $i let $[ i+=1 ] # incremente i de 1 a chaque boucle done
N=$(($N+1))
Bash permet de changer de base (Il est par défaut en base 10)
0n
exemple : 02 ⇒ 2 en base 8
0xn
exemple : 0x3 ⇒ 3 en base 16
base#nombre
Le shell pour tous : "Variables et environnement"
variables
Guide avancé d'écriture des scripts Bash : Introduction aux variables et aux paramètres