Selbstdokumentierende Funktionen
Sie können auch Folgendes verwenden :
um die Dokumentation in eine Funktion einzubetten.
Angenommen, Sie haben ein Bibliotheksskript mylib.sh
und bietet eine Vielzahl von Funktionen. Sie können entweder die Bibliothek ( . mylib.sh
) und rufen die Funktionen direkt danach auf ( lib_function1 arg1 arg2
), oder vermeiden Sie es, Ihren Namespace zu überladen und rufen Sie die Bibliothek mit einem Funktionsargument auf ( mylib.sh lib_function1 arg1 arg2
).
Wäre es nicht schön, wenn Sie auch Folgendes eingeben könnten mylib.sh --help
und eine Liste der verfügbaren Funktionen und ihrer Verwendung erhalten, ohne die Funktionsliste im Hilfetext manuell pflegen zu müssen?
#!/bin/bash
# all "public" functions must start with this prefix
LIB\_PREFIX='lib\_'
# "public" library functions
lib\_function1() {
: This function does something complicated with two arguments.
:
: Parameters:
: ' arg1 - first argument ($1)'
: ' arg2 - second argument'
:
: Result:
: " it's complicated"
# actual function code starts here
}
lib\_function2() {
: Function documentation
# function code here
}
# help function
--help() {
echo MyLib v0.0.1
echo
echo Usage: mylib.sh \[function\_name \[args\]\]
echo
echo Available functions:
declare -f | sed -n -e '/^'$LIB\_PREFIX'/,/^}$/{/\\(^'$LIB\_PREFIX'\\)\\|\\(^\[ \\t\]\*:\\)/{
s/^\\('$LIB\_PREFIX'.\*\\) ()/\\n=== \\1 ===/;s/^\[ \\t\]\*: \\?\['\\''"\]\\?/ /;s/\['\\''"\]\\?;\\?$//;p}}'
}
# main code
if \[ "${BASH\_SOURCE\[0\]}" = "${0}" \]; then
# the script was executed instead of sourced
# invoke requested function or display help
if \[ "$(type -t - "$1" 2>/dev/null)" = function \]; then
"$@"
else
--help
fi
fi
Ein paar Anmerkungen zum Code:
- Alle "öffentlichen" Funktionen haben das gleiche Präfix. Nur diese sind dazu bestimmt, vom Benutzer aufgerufen und im Hilfetext aufgeführt zu werden.
- Die Selbstdokumentationsfunktion beruht auf dem vorherigen Punkt und verwendet
declare -f
um alle verfügbaren Funktionen aufzuzählen, und filtert sie dann durch sed, um nur Funktionen mit dem entsprechenden Präfix anzuzeigen.
- Es ist ratsam, die Dokumentation in einfache Anführungszeichen zu setzen, um unerwünschte Expansionen und das Entfernen von Leerzeichen zu verhindern. Auch bei der Verwendung von Apostrophen/Anführungszeichen im Text ist Vorsicht geboten.
- Sie könnten Code schreiben, um das Bibliothekspräfix zu internalisieren, d.h. der Benutzer muss nur eingeben
mylib.sh function1
und es wird intern übersetzt in lib_function1
. Dies ist eine Übung, die dem Leser überlassen bleibt.
- Die Hilfefunktion heißt "--help". Dies ist ein bequemer (d.h. träger) Ansatz, der den Bibliotheksaufruf-Mechanismus nutzt, um die Hilfe selbst anzuzeigen, ohne eine zusätzliche Prüfung für
$1
. Gleichzeitig wird Ihr Namespace unübersichtlich, wenn Sie die Bibliothek als Quelle angeben. Wenn Ihnen das nicht gefällt, können Sie entweder den Namen in etwas wie lib_help
oder die Args tatsächlich auf --help
im Hauptcode und rufen Sie die Hilfefunktion manuell auf.