====== script bash : Fonctions ====== * Objet : script bash : Fonctions * 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=142815#p142815 | 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-detail-sur-les-parametres-et-les-boucles|modification de variable et de paramètre]] * [[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-sorie-et-les-tests]] * [[doc:programmation:shells:tableaux|script-bash-les-tableaux]] * ;-) ===== Définition d'une fonction ===== Définitions des fonctions de l'interpréteur Une fonction de l'interpréteur est un objet qui est appelé comme une commande simple et qui exécute une commande composée avec un nouveau jeu de paramètres positionnels. Les fonctions de l'interpréteur sont déclarées de la façon suivante : nom () commande-composée [redirection] function nom [()] commande-composée [redirection] 8-o ==== Différentes syntaxes ==== * Syntaxes avec la commande ''function'' : function nom-de-la-fonction { suite-de-commandes } nom-de-la-fonction ou function nom-de-la-fonction { suite-de-commandes } nom-de-la-fonction * ''function'' : c'est la commande ''function'' ; * entre les ''{ }'' c'est le corps de la fonction ; * ne pas oublier l'espace avant ''{'' ; * on y place la ou les commandes exécutées par l'appel de la fonction; * l'appel de la fonction se fait après sa définition; * c'est le fait de mentionner le nom de la fonction qui l'appelle ou permet d'exécuter les commandes du corps de la fonction. * Exemple : #!/bin/bash function f { echo "Bonjour tout le monde" } f ./mon-script Bonjour tout le monde Les mots réservés ''function'' et ''}'' doivent être les premiers d'une commande pour qu'ils soient reconnus.\\ Sinon il suffit de mettre '';}'' (avec un espace devant '';'') * Syntaxe avec ''nom-de-la-fonction (){'' : #!/bin/bash mafonction (){ echo hello } mafonction ./mon-script coucou * Syntaxe proche de C : #!/bin/bash mafonction () { echo hello } mafonction **Une fonction ne peut pas être vide !**\\ Il faut mettre forcément des commandes dans le corps de la fonction. ==== Les arguments du script et les paramètres d'une fonction ==== * On voit souvent les termes arguments et paramètres comme des synonymes car les arguments passés au script peuvent être récupérés pour être utilisés comme paramètres passés à une/des fonction(s) déclarées et implémentées dans le script. * Voyons d'abord comment passer des paramètres à une fonction du script. *Les appels des arguments d'une fonction sont placés dans le corps de celle-ci.\\ *Et les arguments sont placés de gauche à droite et du premier au dernier, à côté du nom d'appel de la fonction\\ *la valeur du premier argument est référencée par ''$1''\\ *la valeur du deuxième argument est référencée par ''$2'', etc.\\ *les paramètres spéciaux ''$0'' (Contient le nom du script tel qu'il a été invoqué), ''$#'' (Le nombre de paramètres passés au script), $@ (l'ensemble des arguments, un argument par paramètre) , ''$*'' (l'ensemble des paramètres sous la forme d'un seul argument), ''$?'' (Le code retour de la dernière commande), ''$$'' (le PID su shell qui exécute le script), ''$!'' (le PID du dernier processus lancé en arrière-plan) #!/bin/bash function f { echo $0 echo $USER echo $3 $1 $2 echo $# echo $@ echo $* } f chez debian facile #chez : premier argument #debian : deuxième argument #facile : troisième argument ./mon-script ./mon-script hypathie facile chez debian 3 chez debian facile chez debian facile * Les paramètres de la fonction peuvent être les paramètres passés au script. #!/bin/bash function f { echo "SCRIPT_NAME : " $0 echo "USER : " $USER echo "Script Argument 1 : "$1 "Script Argument 2 : "$2 "Script Argument 2 : "$3 } f $1 $2 $3 ./ParamToScript.sh arg1 arg2 arg3 SCRIPT_NAME : ./ParamToScript.sh USER : hypathie Script Argument 1 : \nScript Argument 2 : \Script Argument 2 : ==== La commande interne shift ==== Cette commande permet de décaler la numérotation des paramètres de position de la fonction function minipoesie { echo "nom complet : $0" echo " " echo "$*" # avant 'shift 1' shift 1 echo "$*" # après 'shift 1' echo "$*" # avant 'shift 2' shift 2 echo -e "\t$*" # après 'shift 2' echo -e "\t $*" # avant 'shift 3' shift 3 echo -e "\t $*" # après 'shift 3' } minipoesie hypathie chez debian facile ./minipoesie nom complet : ./minipoesie hypathie chez debian facile chez debian facile chez debian facile facile facile facile Et voilà, vous devriez maintenant être capable de tout comprendre de l'exemple de ce lien : * [[doc:programmation:shell:avancee#les-fonctions|Fonctionnalités avancées du Shell : Les fonctions]] ;-) Et n'oubliez pas de retourner à la comparaison : * [[doc:programmation:bash:script:tableaux#se-creuser-un-peu-les-meninges|se creuser un peu les méninges]] ! ==== Fonctions et redirections ==== nom () commande-composée [redirection] function nom [()] commande-composée [redirection] ''[redirection]'' 8-o ==== Utiliser le pipe ==== Voir le tuto : [[doc:programmation:shell:pipe|Le pipe ou tuyau]] #!/bin/bash getip (){ /sbin/ifconfig ${1:-eth0} | egrep "([0-9]{1,3}\.){3}[0-9]{1,3}" } getip ou #!/bin/bash getip (){ /sbin/ifconfig ${1:-eth0} } getip | egrep "([0-9]{1,3}\.){3}[0-9]{1,3}" ./getip.sh inet adr:192.168.0.22 Bcast:192.168.0.255 Masque:255.255.255.0 ===== Fonction, variables et paramètres passés au script ==== Créer une fonction qui permet d'afficher une variable et les paramètres passés au script. #!/bin/bash var=coucou fct() { echo "$var" echo "$1 $2" } fct $1 $2 ./essai.sh a b coucou a b ===== Fonctions et autres commandes ===== À savoir : Comme la commande "exit", la commande "return" permet de changer le code de retour, mais contrairement à "exit", return fait sortir de la fonction (arrête l'exécution des commandes du corps de la fonction), sans arrêter l'ensemble du programme (script). #!/bin/bash # La fonction "fct1" a pour condition d'exécution de ses commandes # un test qui vérifie qu'elle a un argument. # Comme elle en a un, il s'exécute 'echo $1' et 'return 0' qui attribue le code de retour 0. # && : exécution de la seconde cmd, si le code de retour de la première est 0 : c'est le cas # donc exécution de 'echo $? # || : exécution de la seconde cmd, si le code de retour de la première est différente de zéro # donc pas d'exécution de 'echo "coucou"' function fct1 { if [ $1 ]; then echo "$1" return 0 fi } fct1 yep && echo $? || echo "coucou" echo " " # pour espacer le retour # pas d'argument, donc c'est le 'else' qui s'exécute # donc exécution de 'echo "pas d'argument...' et de 'return 1' # || : exécution de la seconde cmd, si le code de retour de la première est différente de zéro # donc exécution de 'echo "coucou"' fct2() { if [ $1 ]; then echo "$1" else echo "pas d'argument à cette fonction" return 1 echo "après return" # On est sortie de la fonction : pas d'exécution de 'echo' fi } fct2 || echo "coucou" yep 0 pas d'argument à cette fonction coucou ===== Commande source ===== Il est possible d'utiliser la fonction d'un script dans un autre script. * Soit le script "echocolor.sh" ci-dessous : # voici des variables affectée des codes couleurs qu'on trouve sur le net noir='\e[0;30m' gris='\e[1;30m' rougefonce='\e[0;31m' rouge='\e[1;31m' vertfonce='\e[0;32m' vertclair='\e[1;32m' orange='\e[0;33m' jaune='\e[1;33m' bleufonce='\e[0;34m' mauve='\e[1;34m' fuschia='\e[0;35m' rose='\e[1;35m' cyan='\e[0;36m' bleuclair='\e[1;36m' blanc='\e[1;37m' normal='\e[0;m' echocolor() { echo -e "${@}${normal}" } Voir sur internet, par exemple : [[http://www.admin-linux.fr/?p=9011|ici]] pour les codes couleur. * Dans le script "source.sh" ci-dessous, on va se servir de la fonction "echocolor" du script "echocolor.sh" pour coloriser les sorties des commandes. #!/bin/bash source echocolor.sh # ou .nom_du_script minipoesie() { echo "$*" shift 1 echo "$*" echo "$*" shift 2 echo -e "\t$*" echo -e "\t $*" shift 3 echo -e "\t $*" } minipoesie hypathie chez debian facile echocolor $orange "c'est une mauvaise poésie" L'exécution de ./source.sh permet de coloriser en orange la chaîne "c'est une mauvaise poésie". OU MIEUX : #!/bin/bash source echocolor.sh # ou .nom_du_script minipoesie() { echocolor $bleuclair "$*" shift 1 echocolor $rose "$*" echocolor $jaune "$*" shift 2 echocolor -e $cyan "\t$*" echocolor -e $fuschia "\t $*" shift 3 echocolor -e $mauve "\t $*" } minipoesie hypathie chez debian facile Avec les couleurs, c'est un peu plus joli =)