support des options avancées

This commit is contained in:
Jephté Clain 2023-12-12 14:43:54 +04:00
parent 3fc5f05f5d
commit d44937132a
2 changed files with 30 additions and 12 deletions

View File

@ -30,8 +30,10 @@ parse_args "$@"; set -- "${args[@]}"
au retour de la fonction, args contient les arguments qui n'ont pas été traités au retour de la fonction, args contient les arguments qui n'ont pas été traités
automatiquement. automatiquement.
l'option --help est automatiquement gérée. les descriptions sont utilisées pour les options --help et --help-all sont automatiquement gérées. avec --help,
l'affichage de l'aide. seules les options standards sont affichées. --help-all affiche toutes les
options. les descriptions sont utilisées pour l'affichage de l'aide. une option
avancée est identifiée par une description qui commence par ++
desc desc
: description de l'objet du script ou de la fonction. cette valeur est : description de l'objet du script ou de la fonction. cette valeur est
@ -101,7 +103,8 @@ action
l'option (avec ou sans argument, ajout ou non à un tableau) l'option (avec ou sans argument, ajout ou non à un tableau)
optdesc optdesc
: description de l'option. cette valeur est facultative" : description de l'option. cette valeur est facultative. si la description
commence par ++, c'est une option avancée qui n'est pas affichée par défaut."
function parse_args() { function parse_args() {
[ -z "$NULIB_NO_DISABLE_SET_X" ] && [[ $- == *x* ]] && { set +x; local NULIB_ARGS_SET_X=1; } [ -z "$NULIB_NO_DISABLE_SET_X" ] && [[ $- == *x* ]] && { set +x; local NULIB_ARGS_SET_X=1; }
local __r= local __r=
@ -169,7 +172,7 @@ function __parse_args() {
__def="${__def#-}" __def="${__def#-}"
__lopts="$__lopts${__lopts:+,}$__def$__witharg" __lopts="$__lopts${__lopts:+,}$__def$__witharg"
fi fi
[ "$__def" == help ] && __autohelp= [ "$__def" == help -o "$__def" == help-all ] && __autohelp=
done done
# sauter l'action # sauter l'action
shift shift
@ -179,7 +182,7 @@ function __parse_args() {
# __sopts ne doit pas être vide, rajouter ? si aucune option courte n'est # __sopts ne doit pas être vide, rajouter ? si aucune option courte n'est
# définie, indépendamment de la valeur de autohelp # définie, indépendamment de la valeur de autohelp
[ -n "$__autohelp" ] && __lopts="$__lopts${__lopts:+,}help" [ -n "$__autohelp" ] && __lopts="$__lopts${__lopts:+,}help,help-all"
[ -n "$__sopts" ] || __sopts=? [ -n "$__sopts" ] || __sopts=?
__sopts="$__popt$__sopts" __sopts="$__popt$__sopts"
@ -236,7 +239,7 @@ function __parse_args() {
fi fi
} }
function showhelp@() { function showhelp@() {
local help="$MYNAME" local help="$MYNAME" showadv="$1"
if [ -n "$__DESC" ]; then if [ -n "$__DESC" ]; then
help="$help: $__DESC" help="$help: $__DESC"
fi fi
@ -288,7 +291,7 @@ $prefix$usage"
fi fi
done done
# description de l'option # description de l'option
local first=1 local first=1 thelp tdesc
for __def in "${__defs[@]}"; do for __def in "${__defs[@]}"; do
__def="${__def%%:*}" __def="${__def%%:*}"
if [[ "$__def" == --* ]]; then if [[ "$__def" == --* ]]; then
@ -301,20 +304,30 @@ $prefix$usage"
fi fi
if [ -n "$first" ]; then if [ -n "$first" ]; then
first= first=
help="$help${nl} " thelp="${nl} "
else else
help="$help, " thelp="$thelp, "
fi fi
help="$help$__def" thelp="$thelp$__def"
done done
[ -n "$__witharg" ] && help="$help VALUE" [ -n "$__witharg" ] && thelp="$thelp VALUE"
# sauter l'action # sauter l'action
shift shift
# prendre la description le cas échéant # prendre la description le cas échéant
if [ "${1#-}" == "$1" ]; then if [ "${1#-}" == "$1" ]; then
help="$help${nl} ${1//$nl/$nl }" tdesc="$1"
if [ "${tdesc#++}" != "$tdesc" ]; then
# option avancée
if [ -n "$showadv" ]; then
tdesc="${tdesc#++}"
else
thelp=
fi
fi
[ -n "$thelp" ] && thelp="$thelp${nl} ${tdesc//$nl/$nl }"
shift shift
fi fi
[ -n "$thelp" ] && help="$help$thelp"
done done
uecho "$help" uecho "$help"
exit 0 exit 0
@ -413,6 +426,9 @@ function __parse_opt() {
if [ "$option_" == --help -o "$option" == -? ]; then if [ "$option_" == --help -o "$option" == -? ]; then
__action="showhelp@" __action="showhelp@"
return 0 return 0
elif [ "$option_" == --help-all ]; then
__action="showhelp@ ++"
return 0
fi fi
fi fi
# ici, l'option n'a pas été trouvée, on ne devrait pas arriver ici # ici, l'option n'a pas été trouvée, on ne devrait pas arriver ici

View File

@ -8,6 +8,8 @@ args=(
-f:,--input input= "spécifier le fichier en entrée -f:,--input input= "spécifier le fichier en entrée
il est possible de spécifier aussi un répertoire auquel cas un fichier par défaut est chargé il est possible de spécifier aussi un répertoire auquel cas un fichier par défaut est chargé
nb: l'aide pour cette option doit faire 3 lignes indentées" nb: l'aide pour cette option doit faire 3 lignes indentées"
-a,--std . "cette option apparait dans les options standards"
-b,--adv . "++cette option apparait dans les options avancées"
) )
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"