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 !

2 réflexions au sujet de « Bibliothèque C-like en bash »

    1. Avatar de PawamoyPawamoy Auteur de l’article

      Salut KooK ! (désolé pour le temps de réponse)
      J’avoue que je n’ai pas trop cherché sur le net s’il existe déjà des bibliothèques de fonctions en bash, mais là je suis en train d’en m’en fabriquer une :)
      Je pioche par ci par là des scripts déjà écrits, j’en fais des fonctions, j’écris ce qui manque…

      J’essaie de faire en sorte que la bibliothèque permette de réaliser facilement des scripts pouvant être lancé en console ET graphiquement (genre clic droit dans thunar ou autre)

      Je peux mettre les fichiers (le « projet ») sur GitHub si tu veux y accéder/participer, mais bon pour l’instant y’a vraiment pas grand-chose

      #EDIT: j’ai effectivement trouvé des bibliothèques sur le net, voici une page qui en liste pas mal
      http://dberkholz.com/2011/04/07/bash-shell-scripting-libraries/

Laisser un commentaire