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 →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:script-bash-variables-arguments-parametres [03/06/2014 18:43] Hypathie [Création de variables] |
doc:programmation:shells:script-bash-variables-arguments-parametres [04/06/2014 12:28] Hypathie [Création, suppression, exportation de variables] |
||
---|---|---|---|
Ligne 14: | Ligne 14: | ||
Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! | ||
- | ===== Création de variables ===== | + | ===== Création, suppression, exportation de variables ===== |
- | En liens nécessaires : \\ | + | |
- | [[doc:programmation:shell:shell#variables-et-environnement|Le shell pour tous : "Variables et environnement"]]\\ | + | |
- | [[doc:programmation:shell:variables]] | + | |
**Le nom d'une variable est un simple pointeur vers l'emplacement mémoire où sont conservées les données qu'elle contient.**\\ | **Le nom d'une variable est un simple pointeur vers l'emplacement mémoire où sont conservées les données qu'elle contient.**\\ | ||
Ligne 169: | Ligne 166: | ||
read -p "entrez votre de naissance (deux derniers chiffres): " -n 2 annee | read -p "entrez votre de naissance (deux derniers chiffres): " -n 2 annee | ||
</note> | </note> | ||
+ | ====Modification de la valeur d'une variable et protection ==== | ||
+ | ===Modification=== | ||
+ | Pour modifier la valeur d'une variable, il suffit de l'affecter d'une nouvelle valeur. | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | var1=bonjour | ||
+ | echo $var1 | ||
+ | var1=23 | ||
+ | echo $var1 | ||
+ | var1= | ||
+ | echo $var1 | ||
+ | var1=Bonjour | ||
+ | echo $var1 | ||
+ | </code> | ||
+ | |||
+ | Retour : | ||
+ | <code> | ||
+ | bonjour | ||
+ | 23 | ||
+ | |||
+ | Bonjour | ||
+ | </code> | ||
+ | ===proctection : redonly === | ||
+ | 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. | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | var1=toto | ||
+ | var2= | ||
+ | echo "$var1 $var2" | ||
+ | readonly var1 var2 | ||
+ | var1=titi | ||
+ | var2=titi | ||
+ | unset var1 var2 | ||
+ | </code> | ||
+ | Retour : | ||
+ | |||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | ====Suppression de variable : unset==== | ||
+ | Soit le script "essai.sh" : passons à ce script l'argument "vous" | ||
+ | |||
+ | <code bash> | ||
+ | #!/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" | ||
+ | </code> | ||
+ | |||
+ | Retour : | ||
+ | |||
+ | <code> | ||
+ | #!/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" | ||
+ | </code> | ||
+ | Retour : | ||
+ | |||
+ | <code bash> | ||
+ | yep coucou | ||
+ | yep | ||
+ | |||
+ | mais pour un paramètre : | ||
+ | |||
+ | yep coucou vous | ||
+ | yep | ||
+ | yep vous | ||
+ | </code> | ||
=====Quand les valeurs sont des paramètres ===== | =====Quand les valeurs sont des paramètres ===== | ||
Ligne 250: | Ligne 342: | ||
</code> | </code> | ||
- | * **Mais avec la commande set qui fixe des paramètres de position:** | + | * **Mais avec la commande set qui modifie provisoirement les paramètres :** |
+ | Pour plus de détails sur la commande set voir : [[atelier:chantier:script-bash-detail-sur-les-parametres-et-les-boucles?&#syntaxe-de-set]] | ||
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 297: | Ligne 390: | ||
</code> | </code> | ||
- | ====Récupérer la longueur d'une valeur de variable ==== | + | =====Récupérer la longueur d'une valeur de variable===== |
* **Pour obtenir la longueur d'une chaîne stockée dans une variable, on écrit ${#VAR}.** | * **Pour obtenir la longueur d'une chaîne stockée dans une variable, on écrit ${#VAR}.** | ||
Ligne 310: | Ligne 403: | ||
* ** Pour récupérer la longueur d'un paramètre de position** | * ** Pour récupérer la longueur d'un paramètre de position** | ||
FIXME | FIXME | ||
+ | |||
+ | |||
+ | |||
+ | =====Substitutions de commande===== | ||
+ | |||
+ | Permet de se servir de la sortie d'une commande dans un autre contexte pour ; | ||
+ | - affecter cette sortie à une variable ; | ||
+ | - utiliser cette sortie comme argument d'une autre commande | ||
+ | - etc. | ||
+ | |||
+ | Il y a deux syntaxes : | ||
+ | <code> | ||
+ | `commande` | ||
+ | </code> | ||
+ | |||
+ | OU | ||
+ | |||
+ | <code> | ||
+ | $(commande) | ||
+ | </code> | ||
+ | |||
+ | ===$(cmd) : des exemples=== | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | dir=$(pwd) | ||
+ | echo "mon répertoire est : $dir" | ||
+ | </code> | ||
+ | <code> | ||
+ | mon répertoire est : /home/hypathie | ||
+ | </code> | ||
+ | *plusieurs commandes: | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | echo $(pwd ; ls) | ||
+ | </code> | ||
+ | === $(cmd) : imbrication de commandes :=== | ||
+ | <code bash> | ||
+ | echo $( ls $(pwd)/Documents) | ||
+ | </code> | ||
+ | *avec set : | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | set $(pwd ; whoami) | ||
+ | echo "$1 : $2" | ||
+ | echo $# | ||
+ | </code> | ||
+ | Ou | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | set -- $(ls -l $(pwd)/.bashrc) | ||
+ | echo $* | ||
+ | </code> | ||
+ | |||
+ | =====Typologie des variables ===== | ||
+ | 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 quand 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.\\ | ||
+ | |||
+ | ====declare et typeset ==== | ||
+ | ^ 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 : [[http://abs.traduc.org/abs-5.1-fr/ch09s04.html|Guide avancé d'écriture des scripts Bash: 9.4. Typer des variables : declare ou typeset]] | ||
+ | |||
+ | ===Remarques sur la commande declare -i et les calculs === | ||
+ | |||
+ | <note important> | ||
+ | **Méthode non POSIX**\\ | ||
+ | * La valeur d'une variable peut une expression arithmétique, pour initialiser une variable de type entier on utilise l'option -i de la commande declare : declare -i nom[=expression] nom[=expression] ... | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | declare -i x=35*2 | ||
+ | echo $x | ||
+ | </code> | ||
+ | retour | ||
+ | <code> | ||
+ | 70 | ||
+ | </code> | ||
+ | |||
+ | * Pour que la valeur d'une variable ne soit pas accidentellement modifier, il faut ajouter l'attribut -r. | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | declare -ir a=35*2 | ||
+ | declare -ir b=5+5 | ||
+ | echo $(($a+$b)) | ||
+ | </code> | ||
+ | retour | ||
+ | <code> | ||
+ | 80 | ||
+ | </code> | ||
+ | |||
+ | **POSIX : Les commandes let et ( ( ... ) ) permettent de typer les variables pour effectuer des calculs sur les variables (synonyme de declare -i).** | ||
+ | </note> | ||
+ | |||
+ | |||
+ | ===== Variables numériques et calculs ===== | ||
+ | |||
+ | ==== Les variables typées pour les calculs : let ou (( ... )) ==== | ||
+ | **Voir : [[atelier:chantier:page-man-bash-iv-symboles-dans-les-calculs-mathematiques?&#operateurs-arithmetiques|les opérateurs arithmétiques]]** | ||
+ | ===syntaxe=== | ||
+ | <code> | ||
+ | let 'var = 5 + 5' | ||
+ | OU LE SHELL ARITHMÉTIQUE : | ||
+ | $(( 5 * 3 )) | ||
+ | </code> | ||
+ | === exemples=== | ||
+ | <code bash> | ||
+ | #!/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 )) | ||
+ | </code> | ||
+ | Retour | ||
+ | <code> | ||
+ | 12 | ||
+ | 20 | ||
+ | 30 | ||
+ | |||
+ | 10 | ||
+ | |||
+ | 40 | ||
+ | 1 | ||
+ | </code> | ||
+ | |||
+ | ==== L'affectation arthmétique==== | ||
+ | **Voir [[atelier:chantier:page-man-bash-iv-symboles-dans-les-calculs-mathematiques?&#operateurs-d-affectation-arithmetique| 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.\\ | ||
+ | |||
+ | === Exemples === | ||
+ | |||
+ | <code bash> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===incrémentation, décrémentation de la valeur 1 : ( ( var++ ) ) ; ( ( ++var ) ) ; ( ( var- - ) ), etc.=== | ||
+ | |||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | let "var = 5" | ||
+ | echo "$var" | ||
+ | (( var++ )) | ||
+ | echo "$var" | ||
+ | (( var-- )) | ||
+ | echo "$var" | ||
+ | </code> | ||
+ | Retour : | ||
+ | |||
+ | <code> | ||
+ | 5 | ||
+ | 6 | ||
+ | 5 | ||
+ | </code> | ||
+ | |||
+ | ====Changements de bases ==== | ||
+ | Bash permet de changer de base (Il est par défaut en base 10)\\ | ||
+ | * base 8 (octal) : un chiffre précédé de **0**\\ | ||
+ | exemple : 02 => 2 en base 8 | ||
+ | * base 16(hexadécimal): un chiffre précédé de **0x**\\ | ||
+ | exemple : 0x3 => 3 en base 16 | ||
+ | * autres bases : base#nombre | ||
+ | * base maximale : base 64 | ||
+ | |||
+ |