En
csh, il n'y avait pas vraiment de
fonctions. On pouvait les simuler en appelant un script à l'intérieur d'un autre. C'est ce que je vous ai montré en appelant
tradMois à l'intérieur de
rapport. Cela nous oblige à découper le programme qu'on veut réaliser en plusieurs fichiers de scripts : un par fonction. Ce n'est pas forcément plus mal : c'est une bonne manière de s'organiser. Mais ça ne plait pas à tout le monde.
En
ksh, il y a de vraies
fonctions. Et on peut tout mettre dans un seul fichier, si on veut (au risque de ne plus s'y retrouver).
D'accord... Mais c'est quoi, une fonction ?
C'est un petit bout de programme, une série d'instructions, que l'on peut appeler à plusieurs reprises dans le script, en lui donnant éventuellement des
arguments.
Pour créer une fonction, on écrit :
Code : Bash | mafonction() {
instructions de la fonction
...
}
|
Et un peu plus loin dans le script, on l'appelle de cette manière :
Code : Bash | mafonction argument1 argument2
|
À l'intérieur de la fonction, on peut utiliser les arguments qu'on lui a transmis. Ils sont désignés par
$1,
$2, etc. Ce qui signifie qu'on ne peut pas utiliser dans la fonction les arguments du script principal, à moins de les lui transmettre explicitement.
tradMois()
Pour nous exercer, nous allons traduire en
ksh le script
rapport. Il faut commencer par transformer
tradMois en une fonction
ksh :
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | #!/usr/local/bin/ksh93
tradMois() {
court=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
long=(janvier fevrier mars avril mai juin juillet aout\
septembre octobre novembre decembre)
i=0
until [[ $i -eq 12 ]]; do
if [[ $1 = ${court[$i]} ]]; then
echo ${long[$i]}
fi
((i++))
done
}
#Appel de la fonction, avec l'argument Dec, pour décembre
tradMois Dec
|
Ce qui affiche :
decembre.
On s'est servi d'une boucle
until pour faire varier
i de 0 à 12. Au début du dernier tour de boucle, i vaut
11. Et à la fin de ce même tour,
i = 12, donc la condition du
until devient vraie et on n'entre plus dans la boucle.
Le
$1 est l'argument que vous avez transmis à la fonction, c'est-à-dire
Dec.
Remarquez aussi que la fonction doit obligatoirement être
implémentée (on doit écrire son contenu) avant d'être appelée. En effet, je vous rappelle que les shells sont des langages interprétés donc, si vous l'appelez avant de la décrire, l'ordinateur ne la connaîtra pas.
rapport.ksh
Passons maintenant au script principal. Je vous rappelle que son rôle est d'analyser un fichier et de vous en indiquer le propriétaire, la date de dernère modification, le nombre de lignes, etc. On doit lui donner le nom de ce fichier en argument.
La structure est celle du script csh
rapport. Mais vous allez remarquer plusieurs différences syntaxiques. Par exemple, tous les numéros de cases des tableaux sont décalés puisqu'on commence à 1 en csh et à 0 en ksh.
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | #!/usr/local/bin/ksh93
tradMois() {
court=(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
long=(janvier fevrier mars avril mai juin juillet aout\
septembre octobre novembre decembre)
i=0
until [[ $i -eq 12 ]]; do
if [[ $1 = ${court[$i]} ]]; then
mois=${long[$i]}
return 3
fi
((i++))
done
}
tabls=(`ls -l $1`)
tabwc=(`wc $1`)
user=${tabls[2]}
groupe=${tabls[3]}
jour=${tabls[6]}
heure=${tabls[7]}
taille=${tabls[4]}
lignes=${tabwc[0]}
mots=${tabwc[1]}
tradMois ${tabls[5]}
print "Le fichier $1 appartient a l'utilisateur $user et au groupe $groupe.\n\
Sa derniere modification date du $jour $mois a $heure.\n\
Il pese $taille Ko et comporte $mots mots repartis en $lignes lignes.\n"
|
J'ai modifié légèrement la fonction
tradMois() car, cette fois, le but n'est pas d'afficher le nom du mois mais de l'affecter à la variable
mois. Et une fois que cette affectation est faite, il est inutile de continuer la boucle. J'ai donc ajouté l'instruction
return, qui vous fait sortir immédiatement de la fonction et "retourne" une valeur.
Là, j'ai choisi de renvoyer la valeur 3. Ce n'est pas très important vu que je ne m'en sers pas après. Sachez cependant que la valeur retournée est ensuite brièvement disponible sous le nom de $?.
$? est à consommer sur place.

Sinon, elle se périme tout de suite. La fonction
tradMois est appelée ici à la ligne 29. Vous pouvez donc utiliser
$? à la ligne 30 (par exemple,
echo $?). Mais ensuite, après le
print, elle n'est plus disponible.
Essayons le script :
Code : Console | % rapport.ksh saisie.ksh
Le fichier saisie.ksh appartient a l'utilisateur brice et au groupe brice.
Sa derniere modification date du 19 juin a 18:39.
Il pese 500 Ko et comporte 75 mots repartis en 16 lignes. |
Bravo ! Vous avez réussi votre première fonction ksh.