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
automatiquement.
l'option --help est automatiquement gérée. les descriptions sont utilisées pour
l'affichage de l'aide.
les options --help et --help-all sont automatiquement gérées. avec --help,
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
: 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)
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() {
[ -z "$NULIB_NO_DISABLE_SET_X" ] && [[ $- == *x* ]] && { set +x; local NULIB_ARGS_SET_X=1; }
local __r=
@ -169,7 +172,7 @@ function __parse_args() {
__def="${__def#-}"
__lopts="$__lopts${__lopts:+,}$__def$__witharg"
fi
[ "$__def" == help ] && __autohelp=
[ "$__def" == help -o "$__def" == help-all ] && __autohelp=
done
# sauter l'action
shift
@ -179,7 +182,7 @@ function __parse_args() {
# __sopts ne doit pas être vide, rajouter ? si aucune option courte n'est
# 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=?
__sopts="$__popt$__sopts"
@ -236,7 +239,7 @@ function __parse_args() {
fi
}
function showhelp@() {
local help="$MYNAME"
local help="$MYNAME" showadv="$1"
if [ -n "$__DESC" ]; then
help="$help: $__DESC"
fi
@ -288,7 +291,7 @@ $prefix$usage"
fi
done
# description de l'option
local first=1
local first=1 thelp tdesc
for __def in "${__defs[@]}"; do
__def="${__def%%:*}"
if [[ "$__def" == --* ]]; then
@ -301,20 +304,30 @@ $prefix$usage"
fi
if [ -n "$first" ]; then
first=
help="$help${nl} "
thelp="${nl} "
else
help="$help, "
thelp="$thelp, "
fi
help="$help$__def"
thelp="$thelp$__def"
done
[ -n "$__witharg" ] && help="$help VALUE"
[ -n "$__witharg" ] && thelp="$thelp VALUE"
# sauter l'action
shift
# prendre la description le cas échéant
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
fi
[ -n "$thelp" ] && help="$help$thelp"
done
uecho "$help"
exit 0
@ -413,6 +426,9 @@ function __parse_opt() {
if [ "$option_" == --help -o "$option" == -? ]; then
__action="showhelp@"
return 0
elif [ "$option_" == --help-all ]; then
__action="showhelp@ ++"
return 0
fi
fi
# 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
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"
-a,--std . "cette option apparait dans les options standards"
-b,--adv . "++cette option apparait dans les options avancées"
)
parse_args "$@"; set -- "${args[@]}"