fonctions.tex 4.19 KB
Newer Older
Rémy Huet's avatar
Rémy Huet committed
1
2
\subsection{Introduction aux fonctions}

Rémy Huet's avatar
Rémy Huet committed
3
\begin{frame}
Rémy Huet's avatar
Rémy Huet committed
4
5
6
7
8
	\begin{block}{Contexte}
		Grâce aux boucles, on sait désormais répéter plusieurs fois le même bout de code à la suite.

		Maintenant, comment faire si l'on veut pouvoir répéter une suite d'instructions plusieurs fois, à des endroits différents du programme ? Comment mieux  organiser son code pour le rendre plus lisible, en créant des blocs réalisant une fonctionnalité particulière ?
	\end{block}
9
10
	\medskip
	
Rémy Huet's avatar
Rémy Huet committed
11
	\begin{alertblock}{Définition}
12
		Une fonction, c’est un ensemble d’instructions réutilisable permettant d'effectuer une tâche spécifique. Les fonctions peuvent prendre des \textbf{paramètres} en entrée, ce qui leur permet d'être \textbf{dynamiques}.
Rémy Huet's avatar
Rémy Huet committed
13
	\end{alertblock}
Rémy Huet's avatar
Rémy Huet committed
14
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
15
16

\subsection{Utiliser des fonctions !}
Rémy Huet's avatar
Rémy Huet committed
17
18
19

\begin{frame}[fragile]{Déclarer une fonction}
	Pour déclarer une fonction, on peut utiliser deux syntaxes différentes :
20
21
	\medskip
	
Rémy Huet's avatar
Rémy Huet committed
22
23
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
24
ma_fonction()
Rémy Huet's avatar
Rémy Huet committed
25
\{
26
    instructions
Rémy Huet's avatar
Rémy Huet committed
27
28
\}

29
# OU
Rémy Huet's avatar
Rémy Huet committed
30
31
32

function ma_fonction
\{
33
    instructions
Rémy Huet's avatar
Rémy Huet committed
34
35
36
37
38
39
40
41
42
43
44
45
46
\}
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}

\begin{frame}[fragile]{Appeler une fonction}
	\begin{block}{Explications}
		\textbf{Après} avoir déclaré une fonction, on peut l'appeler depuis n'importe où dans le script.
		Il suffit pour cela d'écrire le nom de la fonction.
	\end{block}
	\begin{block}{Paramètres}
		Une fonction se comporte comme un mini script local. On peut lui passer des paramètres et les récupérer avec la même syntaxe que pour le programme principal.
	\end{block}
47
	Exemple : le script ci-dessous affichera \enquote{toto} :
Rémy Huet's avatar
Rémy Huet committed
48
49
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
50
afficheParam()
Rémy Huet's avatar
Rémy Huet committed
51
\{
52
    echo $1
Rémy Huet's avatar
Rémy Huet committed
53
54
55
56
57
58
\}

afficheParam toto
		\end{Verbatim}
	\end{beamercolorbox}
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
59
60
61
62
63
64
65
66

\subsection{Concepts avancés}

\begin{frame}[fragile]{Portée des variables}
	\begin{block}{Portée par défaut}
		Par défaut, toutes les variables ont une portée \textbf{globale}, c'est à dire qu'elles sont accessibles depuis n'importe quelle partie du script.
	\end{block}
	\begin{block}{Portée locale}
67
		Pour faciliter le déboggage et la lisibilité d'un programme, il est conseillé d'utiliser le plus possibles de variables \textbf{locales} à l'intérieur de nos fonctions, grâce au mot-clé \texttt{local}.
Rémy Huet's avatar
Rémy Huet committed
68
69
70
71
	\end{block}
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\vspace{-10pt}
		\begin{Verbatim}
72
ma_fonction()
Rémy Huet's avatar
Rémy Huet committed
73
\{
74
    local var_locale="C'est une variable locale"
Rémy Huet's avatar
Rémy Huet committed
75
76
77
78
79
80
81
82
83
84
\}

ma_fonction
echo $var_locale
		\end{Verbatim}
	\end{beamercolorbox}
	\begin{block}{}
		Ceci n'affichera rien car la variable \verb+$var_locale+ n'est pas accessible en dehors de \texttt{ma\_fonction}.
	\end{block}
\end{frame}
Rémy Huet's avatar
Rémy Huet committed
85
86
87

\begin{frame}[fragile]{Retour de fonctions}
	\begin{block}{Contexte}
88
		En Bash, on ne peut pas comme dans la plupart des autres langages renvoyer n'importe quoi depuis une fonction via un \texttt{return}.
Rémy Huet's avatar
Rémy Huet committed
89
90
91
		Cette directive ne permet en effet de renvoyer que des entiers (en général des codes d'erreur).
	\end{block}
	\begin{block}{Comment faire ?}
92
93
94
		Pour récupérer la sortie d'une fonction, ou d'un programme, on utilisera la \textbf{substitution} de commande.
		Rappelez vous, c'est la syntaxe avec les backquotes qui permet de capturer la sortie d'une commande dans une variable !
		En revanche, pour récupérer la valeur de retour d'une fonction, ou d'un programme, on utilisera la variable spéciale \verb+$?+.
Rémy Huet's avatar
Rémy Huet committed
95
	\end{block}
96
97
98
99
\end{frame}

\begin{frame}[fragile]{Retour de fonctions}
	\framesubtitle{Exemple}
Rémy Huet's avatar
Rémy Huet committed
100
101
102
103
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
#!/bin/bash

104
fonction()
Rémy Huet's avatar
Rémy Huet committed
105
\{
106
107
    echo 'Salut !'
    return 0
Rémy Huet's avatar
Rémy Huet committed
108
109
\}
var=`fonction`
110
echo $?
Rémy Huet's avatar
Rémy Huet committed
111
112
113
echo $var
		\end{Verbatim}
	\end{beamercolorbox}
114
115
116
117
118
119
120
121
122
123
124
125
126
127
\medskip

L'exécution affichera le résultat suivant. Comprenez-vous pourquoi ?
	\begin{beamercolorbox}[rounded=true, shadow=true]{terminal}
		\begin{Verbatim}
0
Salut !
		\end{Verbatim}
	\end{beamercolorbox}

	\begin{alertblock}{Valeur du code de retour}
		Par convention, un code de retour de $0$ indique le \textbf{succès} de la fonction ou du programme. C'est notamment ce qui est utilisé par Bash pour vérifier qu'une commande a réussi.
	\end{alertblock}
\end{frame}