next up previous contents index
suivant: Commande « return » monter: Les fonctions précédent: Les fonctions   Table des matières   Index

Déclaration et utilisation des fonctions

Syntaxe :


nom_fonction ()
{
    liste
}

Une fonction doit être décrite avant tout appel. Elle gère ses paramètres de la même façon qu'un shell script (variables « 0 » à « 9 », commande « shift », etc.). Elle n'est connu seulement que du process dans lequel elle a été définie.

L'utilisation des fonctions en Shell diffère de celle que l'on peut en faire avec les langages évolués. Elles servent à effectuer un traitement élémentaire à l'intérieur d'un script (connu de lui seul). Si le traitement doit être commun à un ensemble de procédure, il est préférable d'utiliser un script externe.

Une fonction en Shell diffère de celles que l'on peut trouver dans un langage évolué comme le C ou le Fortran par le fait qu'elle ne sait renvoyer qu'un statut d'exécution. Elle ne permet donc pas de remonter de valeurs au programme appelant, voire-même modifier des arguments qui lui seraient passés.

Remarque 10..1 :


Pour plus de clarté, il est préférable de faire précédé le nom de chaque fonction par le caractère « _ » (underscore).

Une fonction s'exécute dans le shell courant, c'est-à-dire dans le même processus. Par conséquent, tout appel à la commande « exit » entraîne la fin du shell script.

Exemple 10..3 :


La fonction ci-après va nous permettre de demander à l'utilisateur de répondre par « O » pour oui ou « N » pour non. A chaque fois que le script aura besoin de poser ce type de question, cette fonction sera appelée. Elle va donc admettre les agurments suivants :

Sachant qu'une fonction ne peut renvoyer qu'un statut d'exécution, il faudra utiliser d'autres mécanismes si l'on veut retourner la réponse effectivement saisie : le mécanisme des redirections d'entrées/sorties.

Dans le cas qui nous interresse, tous les messages de la fonction seront redirigés sur la sortie d'erreurs standard et la réponse saisie par l'utilisateur, sur la sortie standard.

Nous aurons donc :

_ask ()
{
    # Arg1 = message
    # Arg2 = reponse par defaut

    if [ $# -ne 2 ]; then
        echo "Missing arguments in function \"ask\"." >&2
        exit
    fi
    case "$2" in
        o|O)
            message="$1 ([o]/n):"
            ;;
        n|N)
            message="$1 (o/[n]):"
            ;;
        *)
            echo "Invalid default answer in function \"ask\"." >&2
            exit
            ;;
    esac
    while
        echo "$message \c" >&2
        read answer
        [ "$answer" = "" ] && answer=$2
        answer=`echo $answer | tr '[A-Z]' '[a-z]'`
        [ "$answer" != "o" -a "$answer" != "n" ]
    do
        echo "Reponse invalide. Recommencez." >&2
    done
    echo $answer
}

rep=`_ask "Voulez-vous  vraiment poursuivre ce programme" "o"`

if [ "$rep" = "n" ]; then
    exit
fi

echo "Bonjour."
echo "Voici un programme Shell."

rep=`_ask "Est-ce que l'on continue" "o"`
$\cdots$


next up previous contents index
suivant: Commande « return » monter: Les fonctions précédent: Les fonctions   Table des matières   Index
baudry@esme.fr