Il est possible de structurer un script en fonctions. Les variables seront globales si elles sont déclarées avant le corps des fonctions. Les arguments d'une fonction sont reconnus dans son corps par leur ordre dans l'appel : $1, $2, ...
Un script est interprété, ce qui signifie que tous les éléments nécessaires au décodage d'une ligne de commande doivent être connus auparavant; Il est donc indispensable qu'une fonction soit placée avant son appel. Le corps d'un script (le main) est donc placé en dernier.
La structure qui en résulte est donc :
#!/bin/bash
... déclarations globales des variables
# première fonction
function fonction_1
{
.. déclarations locales des variables si nécessaire
... instructions
... les valeurs d'arguments sont $1, $2...
}
# 2ème fonction
function fonction_2
{
... instructions
... les valeurs d'arguments sont $1, $2...
}
# début du script
... instructions
# appel à fonction_1 : 2 arguments x et y
fonction_1 x y
...
# appel à fonction_2 avec 3 arguments
fonction_2 u v w
...
Une fonction peut retourner une valeur par l'instruction
return $valeur
Dans la fonction d'appel cette valeur sera récupérée dans la variable $? Si on veut récupérer une valeur entière.
Pour récupérer une chaîne de caractères on emploiera :
chaine=$ ( fonction_1 [ x y ] )
En voici un exemple.
Arguments d'un script
Lorsqu'on exécute un script il est possible de lui passer des arguments sur la ligne de commande. Ceci est utile, en particulier, pour vérifier le bon usage de ce script : nombre des arguments, courte aide en ligne, à la manière des commandes Unix. Un script n'est qu'une fonction appelée par le shell mais le passage d'arguments s'effectue d'une façon particulière.
- $0 est le nom du script lui-même
- $1, $2.. ${10}, ... .un argument
- $# le nombre d'arguments
- $@ la liste des arguments à partir de $1
Par exemple la séquence suivante déclenchera une courte aide en ligne
if [[ $1 == '?' ]] ;then
echo "usage mon_script nom de fichier"
exit
fi
Exemple d'usage des arguments
Copyright Yves Epelboin, université P.M. Curie, février 2003, MAJ
25 février, 2007