======Script bash : modification de variable et de paramètre ======
* Objet : Script bash : modification de variable et de paramètre
* Niveau requis : {{tag>débutant avisé}}
* Commentaires : FIXME
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
* Suivi :
* Création par [[user>Hypathie]] le 18/03/2014
* Testé par [[user>Hypathie]] Juin 2014
* Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?pid=142173#p142173| Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
**Nota : Les autres wiki :**
* [[doc:programmation:shells:debuter-avec-les-scripts-shell-bash]]
* [[doc:programmation:shells:script-bash-variables-arguments-parametres|script-bash-variables-arguments-parametres]]
* ;-)
* [[doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie|script-bash-enchainement-de-commandes-et-etat-de-sortie]]
* [[doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests|script-bash-etat-de-sortie-et-les-tests]]
* [[doc:programmation:shells:tableaux|script-bash-les-tableaux]]
* [[doc:programmation:shells:fonction|script-bash-les-fonctions]]
===== Modifications de variables=====
Pré-requis : utiliser les structures de contrôle\\
* Voir :
* [[doc:programmation:shell:avancee#boucle-tant-que-while|boucle while]]
* [[doc:programmation:shell:avancee#boucle-pour-tout-for|boucle for]]
====Modifier la variable d'une structure de contrôle par les paramètres de position====
#!/bin/bash
for i in "$@"
do
echo "Vous avez donné à la variable 'i' la valeur : $i."
if [ "$1" != "coucou" ] ; then
echo "Le premier argument doit être 'coucou'."
else
echo "OK"
if [ "$2" != "toi" ] ; then
echo "Le deuxième paramètre doit être 'toi'."
else
echo "MERCI"
fi
fi
done
echo " " #pour sauter une ligne
echo $@
>Ci-dessus, la variable i de la boucle prend tour à tour la valeur des paramètres
>passé au script depuis le terminal et la structure if teste si la chaîne du
>paramètre passé au script (valeur de la variable) correspond au motif voulu.
====Modifier une variable par les paramètres de position déclarés dans le script====
#!/bin/bash
set a b c
echo "Avec 'shift', on se décale d'un paramètre à chaque boucle."
for i in "$@"
do
i=$1
shift 1
echo "les paramètres sont : $1 :$2 :$3 ."
done
Avec 'shift', on se décale d'un paramètre à chaque boucle.
les paramètres sont : b :c : .
les paramètres sont : c : : .
les paramètres sont : : : .
Contrairement aux boucles while et for, la variable du sélecteur case n'est pas modifiée par les paramètres,\\ mais permet de tester chacune des valeurs déclarées dans ses cases, soit avec un paramètre de position, soit avec une variable du script.\\
Voir : [[doc:programmation:shells:script-bash-etat-de-sorie-et-les-tests#tests-sur-parametres-passes-au-scripts|Tests sur paramètres passés au scripts]]
===== Manipuler la valeur des paramètres de position : set=====
==== Syntaxe de de la commande set====
set argument1 [argument2] ...
À savoir :
- variables de substitution prédéfinies [[doc:programmation:shells:bash-les-differents-caracteres-speciaux?variables-de-substitution-predefinies-principalement-dans-les-scripts]]
- [[doc:programmation:shells:script-bash-variables-arguments-parametres?quand-les-valeurs-sont-des-parametres|quand les valeurs sont des paramètres]]
La //commande set// permet d'affecter une valeur provisoire à un ou plusieurs paramètres de position.\\
Les arguments de la commande set seront les valeurs des paramètres.\\
===Exemple===
Soit le script "mon-script"
#!/bin/bash
set un deux trois
echo "$1" "$2" "$3"
echo "$#"
echo "il y a deux paramètres de position : "$1" ; "$2"."
echo " et les enregistre dans une variable prédéfinie pour le shell courant."
./mon-script
un deux trois
3
il y a deux paramètres de position : un ; deux.
et les enregistre dans une variable prédéfinie pour le shell courant.
====Suppression des paramètres de position ====
Soit le script "mon-script"
#!/bin/bash
set a b c
echo $@
set --
echo "Plus de paramètre $@ !"
./mon-script
a b c
Plus de paramètre !
====Attention à la commande set !====
>Comparez les trois exemples ci-dessous :
===Exemple 1===
Soit le script "mon-script1".
#!/bin/bash
var=lettres
set a b c #affectation des paramètres de position a b c
echo "$var" "$1" "$2" "$3"
echo "$#"
if [ $# == 3 ] ; then
echo "il y a trois paramètres, leurs valeurs sont : "$1", "$2", "$3" "
echo " et une variable nommée var de valeur \"lettres\"."
fi
./mon-script1
lettres a b c
3
il y a trois paramètres, leurs valeurs sont : a, b, c
et une variable nommée var de valeur "lettres".
===Exemple 2 ===
Soit le script "mon-script2" à comparer avec "mon-script1" de l'exemple 1.
#!/bin/bash
var=lettres
echo "$var" "$1" "$2" "$3"
echo "$#"
if [ $# == 3 ] ; then
echo "il y a trois paramètres, leurs valeurs sont : "$1", "$2", "$3" "
echo " et une variable nommée var de valeur \"lettres\"."
fi
./mon-script2 a b c
lettres a b c
3
il y a trois paramètres, leurs valeurs sont : a, b, c
et une variable nommée var de valeur "lettres".
=== Exemple 3===
Soit le script "mon-script3" à comparer avec "mon-script2" et "mon-script3".
#!/bin/bash
var=lettres
set 1 2 # affectation des paramètres 1 2
echo "$var" "$1" "$2" "$3"
echo "$#"
if [ $# == 2 ] ; then
echo "il y a deux paramètres, leurs valeurs sont : "$1", "$2", "$3", "$4"."
echo " et une variable nommée var de valeur \"lettres\"."
fi
./mon-script3 a b c d
lettres 1 2
2
il y a deux paramètres, leurs valeurs sont : 1, 2, , .
et une variable nommée var de valeur "lettres".
>La commande ''set'' 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''.
* Sans argument la commande set affiche tous les noms et toutes les valeurs des variables pré-définies. Mais elle n'enregistre pas une valeur d'une variable non-déclarée.
* Soit "mon-script" :
#!/bin/bash
var=lettres
set coucou
set
./mon-script | grep var
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
XAUTHORITY=/var/run/gdm3/auth-for-hypathie-HhozZG/database
var=lettres
>Nous retrouvons la variable var de notre script avec sa valeur "lettres".
./mon-script | grep coucou
_=coucou
>On retrouve un argument unique
./mon-script | grep a b c
grep: b: Aucun fichier ou dossier de ce type
grep: c: Aucun fichier ou dossier de ce type
>Mais on ne retrouve pas les paramètres a b c.
====Usage avancée de la commande set====
===Activer les options du shell dans un script ===
set -o nom-de-l'option
ou
set -abréviation-de-l'option
===Exemple===
Il peut être utile de vérifier grâce à un message d'erreur, si on appelle la valeur d'un paramètre qui n'a pas été défini.
#!/bin/bash
set -o nounset
var=a
var1=
echo $var
echo $var1
echo $var3
a
/home/hypathie/MesScripts/scriess: ligne8: var3 : variable sans liaison
Un tableau des options ici: http://abs.traduc.org/abs-5.3-fr/ch30.html#optionsref
===Ordonner en colonne la sortie de commandes avec set et une boucles===
Par exemple : soit le script ci-dessous boucle-set\\
#!/bin/bash
var=$1
echo $1
set a b c
#set --
echo $@
for i in "$@"
do
i=$1
echo "les paramètres sont : $1 :$2 :$3 ."
shift 1
echo $var
done
./boucle-set un deux trois
a b c
les paramètres sont : a :b :c .
les paramètres sont : b :c : .
les paramètres sont : c : : .
~$
./boucle-set.sh argument1
argument1
a b c
les paramètres sont : a :b :c .
argument1
les paramètres sont : b :c : .
argument1
les paramètres sont : c : : .
argument1
=====La suite c'est ici =====
[[doc:programmation:shells:script-bash-enchainement-de-commandes-et-etat-de-sortie|script-bash-enchainement-de-commandes-et-etat-de-sortie]]