Guide avancé d'écriture des scripts Bash: | ||
---|---|---|
Précédent | Chapitre 4. Introduction aux variables et aux paramètres | Suivant |
des variables visibles seulement à l'intérieur d'un bloc de code ou d'une fonction (voir aussi variables locales dans fonctions)
variables qui affectent le comportement du shell et de l'interface utilisateur
![]() | Dans un contexte plus général, chaque processus a un << environnement >>, c'est-à-dire un groupe de variables contenant l'information à laquelle pourrait faire référence le processus. En ce sens, le shell se comporte comme n'importe quel processus. Chaque fois qu'un shell démarre, il crée les variables shell correspondantes à ses propres variables d'environnement. Mettre à jour ou ajouter de nouvelles variables force le shell à mettre à jour son environnement, et tous les processus fils (les commandes qu'il exécute) héritent de cet environnement. |
![]() | L'espace alloué à l'environnement est limité. Créer trop de variables d'environnement ou une variable d'environnement qui utilise un espace excessif peut causer des problèmes.
(Merci, S. C. pour la clarification, et pour avoir fourni l'exemple ci-dessus.) |
Si un script déclare des variable d'environnement, il faut qu'elles soient << exportées >>, c'est-à-dire, rapportées à l'environnement local du script. C'est la fonction de la commande export .
![]() | Un script peut exporter des variables seulement aux processus fils, c'est-à-dire seulement aux commandes ou processus que ce script particulier initie. Un script invoqué depuis la ligne de commande ne peux pas ré-exporter des variables à destination de l'environnement de la ligne de commande dont il est issu. Des processus fils ne peuvent pas ré exporter de variables aux processus parents qui les ont fait naître. |
---
les arguments passés aux scripts depuis la ligne de commande - $0, $1, $2, $3... $0 est le nom du script lui-même, $1 est le premier argument, $2 le second, $3 le troisième, et ainsi de suite. [1] Après $9, les arguments doivent être entourés d'accolades, par exemple, ${10}, ${11}, ${12}.
Les variables spéciales $* et $@ représentent tous les paramètres positionnels.
Exemple 4-5. Paramètres positionnels
#!/bin/bash # Appelez ce script avec au moins 10 paramètres, par exemple # ./scriptname 1 2 3 4 5 6 7 8 9 10 MINPARAMS=10 echo echo "Le nom de ce script est \"$0\"." # Ajoutez ./ pour le répertoire courant. echo "Le nom de ce script est \"`basename $0`\"." # Supprime le chemin du script (voir 'basename') echo if [ -n "$1" ] # La variable testée est entre guillemets. then echo "Le paramètre #1 est $1" # Nous avons besoin des guillemets pour échapper fi if [ -n "$2" ] then echo "Le paramètre #2 est $2" fi if [ -n "$3" ] then echo "Le paramètre #3 est $3" fi # ... if [ -n "${10}" ] # Les paramètres supérieures à $9 doivent être compris entre #+ accolades. then echo "Le paramètre #10 est ${10}" fi echo "-----------------------------------" echo "Tous les paramètres de la ligne de commande sont: "$*"" if [ $# -lt "$MINPARAMS" ] then echo echo "Donnez-moi au moins $MINPARAMS arguments en ligne de commande!" fi echo exit 0 |
La notation avec accolades pour les paramètres positionnels permet de référencer plutôt simplement le dernier argument passé à un script sur la ligne de commande. Ceci requiert également le référencement indirect.
args=$# # Nombre d'arguments passés. dernarg=${!args} # Noter que dernarg=${!$#} ne fonctionne pas. |
Certains scripts peuvent effectuer différentes opérations suivant le nom sous lequel ils sont invoqués. Pour que cela fonctionne, le script a besoin de tester $0, le nom sous lequel il a été invoqué. Il doit aussi y avoir des liens symboliques vers tous les différents noms du script.
![]() | Si un script attend un paramètre en ligne de commande mais qu'il est invoqué sans, cela peut causer une affectation à valeur nulle, généralement un résultat non désiré. Une façon d'empêcher cela est d'ajouter un caractère supplémentaire des deux côtés de l'instruction d'affectation utilisant le paramètre positionnel attendu. |
variable1_=$1_ # Cela préviendra l'erreur, même si le paramètre positionnel est absent. argument_critique01=$variable1_ # Le caractère supplémentaire peut être retiré plus tard , si besoin est, comme ceci. variable1=${variable1_/_/} # Effets de bord seulement si $variable1_ commence par "_". # Ceci utilise un des patrons de substitution de paramètres discustés au Chapitre 9. # Laisser tout simplement le motif de remplacement aboutit à une destruction. # Une façon plus directe de résoudre ce problème est de simplement tester #+ si le paramètre postionnel attendu a bien été passé. if [ -z $1 ] then exit $PARAM_POS_MANQUANT fi |
---
Exemple 4-6. wh, recherche d'un nom de domaine avec whois
#!/bin/bash # Fait une recherche 'whois nom-domaine' sur l'un des trois serveurs: # ripe.net, cw.net, radb.net # Placez ce script, nommé 'wh' dans /usr/local/bin # Requiert les liens symboliques: # ln -s /usr/local/bin/wh /usr/local/bin/wh-ripe # ln -s /usr/local/bin/wh /usr/local/bin/wh-cw # ln -s /usr/local/bin/wh /usr/local/bin/wh-radb if [ -z "$1" ] then echo "Usage: `basename $0` [nom-domaine]" exit 65 fi case `basename $0` in # Vérifie le nom du script et appele le bon serveur "wh" ) whois $1@whois.ripe.net;; "wh-ripe") whois $1@whois.ripe.net;; "wh-radb") whois $1@whois.radb.net;; "wh-cw" ) whois $1@whois.cw.net;; * ) echo "Usage: `basename $0` [nom-domaine]";; esac exit 0 |
---
La commande shift réassigne les paramètres positionnels, ce qui a le même effet que de les déplacer vers la gauche d'un rang.
$1 <--- $2, $2 <--- $3, $3 <--- $4, etc.
Le vieux $1 disparaît,mais $0 (le nom du script) ne change pas. Si vous faites usage d'un grand nombre de paramètres positionnels dans un script, shift vous permet d'accèder à ceux au-delà de 10, bien que la notation notation {accolades} le permette également.
Exemple 4-7. Utiliser shift
#!/bin/bash # Utilisation de 'shift' pour voir tous les paramètres de position. # Nommez ce script quelque chose comme shft, #+ et appelez-le avec quelques paramètres, par exemple # ./shft a b c def 23 skidoo until [ -z "$1" ] # Jusqu'à ne plus avoir de paramètres... do echo -n "$1 " shift done echo # Retour chariot supplémentaire. exit 0 |
![]() | La commande shift fonctionne aussi avec les paramètres passés à une fonction. Voir Exemple 34-10. |
[1] | Le processus appelant le script affecte le paramètre $0. Par convention, ce paramètre est le nom du script. Voir la page man d'execv. |
Précédent | Sommaire | Suivant |
Les variables Bash ne sont pas typées | Niveau supérieur | Guillemets |