======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]]