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 17:18] Hypathie [Déclaration nulle et modification par le script d'une valeur interne ou externe] |
doc:programmation:shells:script-bash-variables-arguments-parametres [04/06/2014 07:18] Hypathie [Création 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 : \\ | En liens nécessaires : \\ | ||
[[doc:programmation:shell:shell#variables-et-environnement|Le shell pour tous : "Variables et environnement"]]\\ | [[doc:programmation:shell:shell#variables-et-environnement|Le shell pour tous : "Variables et environnement"]]\\ | ||
Ligne 169: | Ligne 169: | ||
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 | ||
- | ===== Déclarer des paramètres de position : set===== | + | Bonjour |
- | ==== syntaxe de set==== | + | </code> |
- | À savoir : variables de substitution prédéfinies [[atelier:chantier:bash-les-differents-caracteres-speciaux?&#variables-de-substitution-predefinies-principalement-dans-les-scripts]] | + | ===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. | |
- | *La commande **set** permet d'affecter une valeur provisoire à un ou plusieurs paramètres de position. | + | <code bash> |
- | Les arguments de la commande set seront les valeurs des paramètres que set positionne.\\ | + | #!/bin/bash |
+ | var1=toto | ||
+ | var2= | ||
+ | echo "$var1 $var2" | ||
+ | readonly var1 var2 | ||
+ | var1=titi | ||
+ | var2=titi | ||
+ | unset var1 var2 | ||
+ | </code> | ||
+ | Retour : | ||
<code> | <code> | ||
- | set argument1 [argument2] ... | + | 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> | </code> | ||
+ | |||
+ | ====Suppression de variable : unset==== | ||
+ | Soit le script "essai.sh" : passons à ce script l'argument "vous" | ||
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | var=lettres | + | var1=coucou |
- | set a b c #affectation des paramètres a b c | + | var2=$1 |
- | echo "$var" "$1" "$2" "$3" | + | echo "$var1 $var2" |
- | if [ $# != 2 ] ; then # (1) | + | unset var2 |
- | echo "il y a trois paramètres et une variable nommée var de valeur \"lettres\" " | + | echo "$var1 $var2" |
- | fi | + | var1=$1 |
+ | var2=vous | ||
+ | echo "$var1 $var2" | ||
+ | unset var2 | ||
+ | echo "$var1 $var2" | ||
</code> | </code> | ||
+ | |||
Retour : | Retour : | ||
<code> | <code> | ||
- | lettres a b c | ||
- | il y a trois paramètres et une variable nommée var de valeur "lettres" | ||
- | </code> | ||
- | **Observez:** | ||
- | * mon-script1 | ||
- | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | set a b c | + | var1=yep |
- | echo $@ | + | var2=coucou |
- | echo "il y a les paramètres de position : $1, $2, $3" | + | echo "$var1 $var2" |
- | echo "Leurs valeurs sont vide: RIEN"$a", RIEN"$b", RIEN"$c"." | + | 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> | </code> | ||
Retour : | Retour : | ||
+ | |||
<code bash> | <code bash> | ||
- | a b c | + | yep coucou |
- | il y a les paramètres de position : a, b, c | + | yep |
- | Leurs valeurs sont vide: RIEN, RIEN, RIEN. | + | |
+ | mais pour un paramètre : | ||
+ | |||
+ | yep coucou vous | ||
+ | yep | ||
+ | yep vous | ||
</code> | </code> | ||
- | ====set annule les paramètres de position affectés précédemment==== | + | |
+ | =====Quand les valeurs sont des paramètres ===== | ||
+ | |||
+ | ====Les paramètres de positions ==== | ||
+ | |||
+ | Lorsqu'on ajoute un argument au script avant son exécution, on peut alors récupérer la valeur de ce paramètre.\\ | ||
+ | |||
+ | * **Pour récupérer chaque paramètre : $1 ; $2 ; $3** etc. | ||
+ | |||
+ | * **Pour récupérer tous les paramètres : $@** | ||
+ | |||
+ | EXEMPLES : soit le script "essai.sh" | ||
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | var=lettres | + | var=Bonjour |
- | set a b c | + | |
echo $var | echo $var | ||
- | echo $@ | + | echo "$1" |
- | echo " " | + | echo "$2" |
- | set gros_pater | + | echo "$3" |
- | echo $var | + | echo "ou le paramètre 1 est: $1, le deuxième est: $2, le troisième est : $3" |
- | echo $1 | + | echo " " |
- | set -- | + | echo "tous les paramètres $@" |
- | echo $var | + | |
- | echo $1 | + | |
</code> | </code> | ||
- | **Retour :** | + | ET |
+ | <code user> | ||
+ | ./essai.sh a b c | ||
+ | </code> | ||
+ | |||
+ | Retour: | ||
<code> | <code> | ||
- | lettres | + | Bonjour # on peut récupérer une valeur (ou des valeurs) déclarée(s) et les paramètres de position |
- | a b c | + | a |
+ | b | ||
+ | c | ||
+ | ou le paramètre 1 est: a, le deuxième est: b, le troisième est : c | ||
- | lettres | + | tous les paramètres a b c |
- | gros_pater | + | |
- | lettres | + | |
</code> | </code> | ||
- | ====Paramètres de position et boucles==== | + | |
- | Par exemple : soit le script ci-dessous boucle-set.sh\\ | + | * **Tous les arguments passés au scripts $* et $@ sont synonymes** |
- | (passer un argument à ce script depuis le terminal) | + | |
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | var=$1 | ||
echo $1 | echo $1 | ||
- | set a b c | + | echo $* |
- | #set -- | + | |
echo $@ | echo $@ | ||
- | + | echo $# | |
- | for i in "$@" | + | |
- | do | + | |
- | i=$1 | + | |
- | + | ||
- | echo "les paramètres sont : $1 :$2 :$3 ." | + | |
- | shift 1 | + | |
- | echo $var | + | |
- | done | + | |
</code> | </code> | ||
+ | ET | ||
<code user> | <code user> | ||
- | ./boucle-set.sh | + | ./essai.sh bonjour à tous |
</code> | </code> | ||
- | Retour : | + | retour : |
- | <code user> | + | |
- | a b c | + | |
- | les paramètres sont : a :b :c . | + | |
- | les paramètres sont : b :c : . | + | <code> |
+ | bonjour | ||
+ | bonjour à tous | ||
+ | bonjour à tous | ||
+ | 3 | ||
+ | </code> | ||
- | les paramètres sont : c : : . | + | * **de même pour $* et $@ :** |
- | + | <code bash> | |
- | ~$ | + | #!/bin/bash |
+ | echo $1 | ||
+ | echo $* | ||
+ | echo $@ | ||
+ | echo $# | ||
</code> | </code> | ||
- | PUIS | + | ET |
<code user> | <code user> | ||
- | ./boucle-set.sh argument1 | + | ./essai.sh "bonjour à tous" |
</code> | </code> | ||
- | |||
retour : | retour : | ||
+ | |||
<code> | <code> | ||
- | argument1 | + | bonjour à tous |
- | a b c | + | bonjour à tous |
- | les paramètres sont : a :b :c . | + | bonjour à tous |
- | argument1 | + | 1 |
- | les paramètres sont : b :c : . | + | |
- | argument1 | + | |
- | les paramètres sont : c : : . | + | |
- | argument1 | + | |
</code> | </code> | ||
- | ====H ) Supprimer les paramètres de position==== | + | * **Mais avec la commande set qui modifie provisoirement les paramètres :** |
- | ===Exemple=== | + | Pour plus de détails sur la commande set voir : [[atelier:chantier:script-bash-detail-sur-les-parametres-et-les-boucles?&#syntaxe-de-set]] |
- | **même script que ci-dessus mais on dé-commente set - - (on enlève # ligne 5) :** | + | <code bash> |
+ | #!/bin/bash | ||
+ | set "bonjour à tous" | ||
+ | echo $* | ||
+ | echo $@ | ||
+ | echo $1 | ||
+ | echo $# | ||
+ | </code> | ||
<code user> | <code user> | ||
- | ./boucle-set.sh | + | ./essai.sh |
</code> | </code> | ||
- | retour : | + | Retour : |
+ | <code > | ||
+ | bonjour à tous | ||
+ | bonjour à tous | ||
+ | bonjour à tous | ||
+ | 1 | ||
+ | </code> | ||
- | <code> | + | OU ENCORE : |
- | ~$ | + | <code> |
+ | #!/bin/bash | ||
+ | set bonjour à tous | ||
+ | echo $* | ||
+ | echo $@ | ||
+ | echo $1 | ||
+ | echo $# | ||
</code> | </code> | ||
- | |||
- | et | ||
<code user> | <code user> | ||
- | ./boucle-set.sh argument1 | + | ./essai.sh |
</code> | </code> | ||
- | retour : | + | Retour : |
- | <code> | + | <code > |
- | argument1 | + | bonjour à tous |
+ | bonjour à tous | ||
+ | bonjour | ||
+ | 3 | ||
- | ~$ | ||
</code> | </code> | ||
- | ====Attention à la commande set : les arguments passés au script sont supprimés==== | ||
- | **Elle supprime toute possibilité de se référer à des paramètres passés au script (depuis le terminal),\\ | ||
- | et ceci y compris si on supprime avec set - - les paramètres de position déclarés avec set.**\\ | ||
+ | =====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}.** | ||
+ | |||
+ | Exemples : | ||
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | #donner les argument 1 2 3 à se script avant de le lancer | + | var="j'aime debian-facile" |
- | var1=$1 ; var2=$2 ; var3=$3 | + | echo ${#var} |
- | echo "les valeurs de var1, var2 et var3 sont les paramètres de position : $@." | + | </code> |
- | echo " " | + | |
- | for i in "$@" | + | |
- | do | + | |
- | echo "les paramètres de position sont : $1 :$2 :$3 ." | + | |
- | shift 1 | + | |
- | done | + | |
- | set a b c | + | * ** Pour récupérer la longueur d'un paramètre de position** |
- | set -- | + | FIXME |
- | for i in "$@" | + | |
- | do | + | |
- | echo "les paramètres sont : $1 :$2 :$3 ." | + | |
- | done | + | =====Substitutions de commande===== |
- | echo " " | + | |
- | echo "les paramètres de position sont "$@"." | + | Permet de se servir de la sortie d'une commande dans un autre contexte pour ; |
- | echo "les valeurs 1, 2, et 3 sont maintenant les valeurs des variables $var1 ; $var2 ; $var3." | + | - affecter cette sortie à une variable ; |
+ | - utiliser cette sortie comme argument d'une autre commande | ||
+ | - etc. | ||
+ | |||
+ | Il y a deux syntaxes : | ||
+ | <code> | ||
+ | `commande` | ||
</code> | </code> | ||
- | Retour : | + | OU |
<code> | <code> | ||
- | les valeurs de var1, var2 et var3 sont les paramètres de position : 1 2 3. | + | $(commande) |
- | + | ||
- | les paramètres de position sont : 1 :2 :3 . | + | |
- | les paramètres de position sont : 2 :3 : . | + | |
- | les paramètres de position sont : 3 : : . | + | |
- | + | ||
- | les paramètres de position sont . | + | |
- | les valeurs 1, 2, et 3 sont maintenant les valeurs des variables 1 ; 2 ; 3. | + | |
</code> | </code> | ||
- | ====remarques sur set ==== | + | |
- | <note > | + | ===$(cmd) : des exemples=== |
- | *Sans argument la commande set affiche TOUS les noms et TOUTES les valeurs des variables pré-définies (celles du script qui l'appelle aussi). Mais elle n'enregistre pas une valeur d'un valeur non-déclarée ! FIXME\\ | + | |
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | var=lettres | + | dir=$(pwd) |
- | set a b c | + | echo "mon répertoire est : $dir" |
- | set | + | |
</code> | </code> | ||
- | Observons les deux dernières lignes du retour : | ||
<code> | <code> | ||
- | XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0 | + | mon répertoire est : /home/hypathie |
- | _=c | + | |
- | var=lettres | + | |
</code> | </code> | ||
- | La première ligne montre en majuscule le nom d'une variable pré-défini, et ce qui suit est la valeur de cette variable. | + | *plusieurs commandes: |
- | Nous retrouvons la variable var de notre script avec sa valeur "lettres". | + | |
- | Mais on ne voit pas les paramètres a b c. | + | |
- | *set -o nom-de-l'option ou set -abréviation-de-l'option: permet d'activer les options du shell dans un script.\\ | + | |
- | Par exemple, on peut vérifier grâce à un message d'erreur si on appelle la valeur d'un paramètre qui n'a pas été défini. | + | |
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
- | set -o nounset | + | echo $(pwd ; ls) |
- | var=a | + | </code> |
- | var1= | + | === $(cmd) : imbrication de commandes :=== |
- | + | <code bash> | |
- | echo $var | + | echo $( ls $(pwd)/Documents) |
- | echo $var1 | + | </code> |
- | echo $var3 | + | *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> | </code> | ||
- | retour : | ||
- | <code> | ||
- | a | ||
- | /home/hypathie/MesScripts/scriess: ligne8: var3 : variable sans liaison | + | =====Typologie des variables ===== |
- | </code> | + | 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.\\ |
- | Voir le tableau des options ici: http://abs.traduc.org/abs-5.3-fr/ch30.html#optionsref | + | On dit pour cela quand bash les variables ne sont pas typées.\\ |
- | </note> | + | 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.\\ |