Bibliothèque C-like en bash

Je sais pas vous, mais moi je suis un fervent utilisateur de scripts écrits en bash, et j’ai parfois les mêmes fonctions qui reviennent dans plusieurs script indépendants. Alors je me suis dit, pourquoi ne pas écrire une fois pour toutes ces fonctions, et les inclure dans l’environnement (commande source) à chaque ouverture d’un terminal ?

.bashrc:

...
source "mon_fichier_de_fonctions"
...

Sauf qu’à force, on entasse pas mal de fonctions, et on a pas trop envie de polluer l’environnement de bash, et encore moins de ralentir son exécution, n’est-ce pas ? Alors j’ai codé 3 fonctions toutes simples qui imite quelque peu le comportement des directives pré-processeur #include, #ifndef, et #define du C.
Ainsi, en admettant que le chemin vers votre bibliothèque de fonctions soit contenu dans la variable library, ça donne :

define() {
    # usage: define VAR [VALUE]
    [ $# -ge 1 ] && eval $1=${2:-def} || return 1
}

ndef() {
    # usage: if ndef VAR; then ...; fi
    [[ $# -eq 1 && -z "$(eval echo \$$1)" ]] || return 1
}

include() {
    # usage: include FILE_IN_LIBRARY
    [[ $# -eq 1 && -f "$library/$1" ]] && . "$library/$1"
}

export -f define
export -f ndef
export -f include

Vous n’avez plus qu’à rajouter 2 lignes dans .bashrc du genre :

export library="ma_bib"
[ -f "$library/include" ] && source "$library/include"

… le fichier include contenant bien sûr ces trois fonctions (vous pouvez aussi mettre les 3 fonctions dans .bashrc, à vous de voir).

Exemple d’utilisation dans un fichier de votre bibliothèque :

Fichier blabla situé dans $library/io

if ndef __FONCTION; then
define __FONCTION

fonction_blabla() {
    echo "blabla"
}

fi # __FONCTION

Fichier is_int situé dans $library/math

if ndef is_int; then
define is_int is_integer

is_integer() {
    printf "%d" $1 2>/dev/null >&2
    return $?
}

fi # is_int

Exemple d’utilisation dans un script :

#!/bin/bash
include io/blabla
include math/is_int

if $is_int $(fonction_blabla); then
    echo "Ca m'étonnerait"
else
    echo "Y'a plus de chances ici"
fi

Petite précision au cas où : il est bien évidemment possible d’imbriquer les inclusions entre fichiers !