Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
Contributeurs, les sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
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.
#!/bin/bash NomDelaVariable=ValeurDeLaVariable
⇒ La valeur “ValeurDeLaVariable” a été mémorisée.
#!/bin/bash nx_fichier=les-fonctions touch ~/$nx_fichier ls -la ~/$nx_fichier
⇒ Les programmes (ou commandes) “touch” et “ls” ont utilisé la valeur de la fonction nommée “nx_fichier”, d'une valeur qui correspond à la chaîne de caractères “les_fonctions”.
#!/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
#!/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
#!/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 !"
Ici “prenom” 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 -p "entrez votre nom et prénom: " nom prenom
retour:
entrez votre nom et prénom:
On entre par exemple debian facile, puis on peut récupérer la valeur de chacune des variables “nom” et “prenom”
echo $prenom $nom
retour :
facile debian
Mais dans un script c'est plus rapide !
Ci-dessous, on ne met pas le “nom” de la variable, parce qu'on ne cherche pas à appeler la valeur de cette variable mais à permettre au programme de se poursuivre.
Quand on entre dans le terminal la réponse attendu par “read”, le retour de la commande et zéro, donc elle est considérée comme exécutée, et le shell passe à l'exécution de la commande suivante.
#!/bin/bash read -p "entrez votre nom d'utilisateur: " echo "bonjour $USER !"
par exemple:
read -p "entrez votre 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 même variable, y compris si cette variable a été déclarée vide.
#!/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 d'un processus père.
Coucou="Bonjour"
puis :
echo 'echo "Coucou=$Coucou"' > test.sh
puis:
chmod u+x test.sh
puis :
export Coucou
puis :
./test.sh
Coucou="Bonjour"
La valeur de la variable “Coucou” est exporté et peut valoir pour le script “test.sh”
qui devient le processus fils du shell courant, à condition que ce script contienne
une variable de même nom (Coucou= ) que celle exportée.
Mais une fois le terminal réinitialisé, si on lance ./test.sh, ce script est le
processus fils de ce “nouveau” processus père (= le nouveau terminal) qui n'a plus
en mémoire la valeur “Bonjour” pour la variable vide “Coucou”.
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.
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 $@"
ET
./essai.sh a b c
Retour:
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 $#
ET
./essai.sh bonjour à tous
retour :
bonjour bonjour à tous bonjour à tous 3
#!/bin/bash echo $1 echo $* echo $@ echo $#
ET
./essai.sh "bonjour à tous"
retour :
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
Retour :
bonjour à tous bonjour à tous bonjour à tous 1
OU ENCORE :
#!/bin/bash set bonjour à tous echo $* echo $@ echo $1 echo $#
./essai.sh
Retour :
bonjour à tous bonjour à tous bonjour 3
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=$value |
Voir : Guide avancé d'écriture des scripts Bash: 9.4. Typer des variables : declare ou typeset
#!/bin/bash declare -i x=35*2 echo $x
retour
70
#!/bin/bash declare -ir a=35*2 declare -ir b=5+5 echo $(($a+$b))
retour
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 ))
Retour
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 : voir plus incrémentation, décrémentation de la valeur 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
#!/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)
exemple : 02 ⇒ 2 en base 8
exemple : 0x3 ⇒ 3 en base 16
Le shell pour tous : "Variables et environnement"
variables
Guide avancé d'écriture des scripts Bash : Introduction aux variables et aux paramètres