Les fonctions
Création — Nicolas THOREZ 2020/03/12 11:20
Les fonctions sont extrêmement utiles en bash. Elles permettent de clarifier un code et/ou d'éviter la répétition de certaines séquences.
Fonctionnement
La déclaration d'une fonction est assez rudimentaire. Il suffit de la nommer en la faisant précéder de (). Son code devra ensuite suivre cette déclaration et être encadré par {}. Par la suite, il suffit d'écrire son nom pour l'appeler.
Exemple :
# déclaration de la fonction du nom => increment
increment()
{
# On ajoute 1 à l'argument
local VAR=$(($1 + 1))
# On renvoie le résultat
echo $VAR
}
# Exemple d'appel de la fonction
increment 12
# Retour de la console
13
Les fonctions peuvent gérer leurs propres variables. Par défaut, toutes variables déclarées l'est dans son périmètre de déclaration. Autrement, si la variable est déclaré dans le corps du script, elle est utilisable dans tout le script, si elle l'est dans une fonction, elle ne sera utilisable que dans la fonction. Les commandes global et local permettent de préciser le périmètre de chaque variable.
Utilisation de paramètres nommés
Les paramètres nommés sont des arguments prédéfinis permettant de renseigner l'utilité de l'argument suivant ou d'activer une fonction particulière, comme par exemple -l de la commande ls ou –help de la plupart des commandes. Il existe plusieurs méthodes de prise en charge de ces arguments, voici celle que j'utilise (on peut la retrouver dans ma fonction de log, add-log - Ajouter des messages à un fichier log et dans la console) :
# Dans le cadre de la fonction dont le rôle est d'ajouter un message horodaté et tagué dans un fichier et dans la console.
# Ses arguments nommés sont :
# -f ou --file qui introduisent le nom du fichier de log
# -l ou --level qui introduisent le tag
# -m ou --message qui introduisent le message à enregistrer
# -v ou --verbose qui active l'affichage dans la console
# Gestion des arguments pour la fonction
while [[ $# -gt 0 ]] # On crée une boucle qui va lire tous les arguments
do
LOG_PARAM="$1" # On définie une variable contenant le premier argument
case $LOG_PARAM in # On vérifie que cet argument correspond à un paramètre nommé
# fichier de logs
-f|--file) # Là, c'est le traitement prévu si l'argument est -f ou --file
LOG="$2" # On enregistre l'argument suivant dans la variable LOG
shift # On utilise shift une première fois pour supprimer le premier argument correspondant au paramètre nommé
shift # On utilise shift une seconde fois pour supprimer la valeur donnée au paramètre nommé
;;
# Niveau de log
-l|--level) # Comme pour -f, c'est ici le traitement de -l et --level
LEVEL="$2"
shift
shift
;;
# Message # Comme pour -f, c'est ici le traitement de -m et --message
-m|--message)
MESSAGE="$2"
shift
shift
;;
# Affichage console
-v|--verbose) # Comme pour -f, c'est ici le traitement de -v et --verbose
VERBOSE="TRUE" # Cette option n'enregistre pas d'argument supplémentaire mais juste une valeur prédéfinie
shift # Du coup, on n'utilise shift qu'une seule fois.
;;
# Autres
*) # Cette option permet de renvoyer une erreur si on utilise un paramètre nommé non prévu
echo "Erreur"
exit 2
esac # A ce niveau, la boucle reprend sans les arguments déjà traité, vu que shift les a supprimés et ce jusqu'à ce qu'il n'y en ait plus
done
# A la fin de la boucle, tous les arguments suivant un paramètre nommé ont été stockés dans une variable et les fonctions spécifiques ont été activées si demandé.
La fonction ou script avec paramètres nommés pourra alors être appelé de la manière suivante :
add-log -f error.log --level INFO -m "Ceci est un exemple" --verbose
Discussion