amélioration parse_args

This commit is contained in:
Jephté Clain 2023-12-11 10:04:02 +04:00
parent 2b10acacb2
commit 3fc5f05f5d
4 changed files with 42 additions and 8 deletions

22
bash/TODO.md Normal file
View File

@ -0,0 +1,22 @@
# nulib/bash
* [ ] args: support des noms d'argument pour améliorer l'affichage de l'aide.
par exemple la définition
~~~
-f:FILE,--input input= "spécifier le fichier en entrée"
~~~
donnera cette aide:
~~~
-f, --input FILE
spécifier le fichier
~~~
* [ ] args: après le support des noms d'arguments, ajouter la génération
automatique de l'auto-complétion basée sur ces informations. certains noms
seraient normalisés: FILE pour un fichier, DIR pour un répertoire, ENV pour
une variable d'environnement, etc.
on pourrait même considérer mettre des patterns pour la sélection, e.g
~~~
"-C,--config:FILE:*.conf" input= "spécifier le fichier de configuration"
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -47,6 +47,8 @@ usage
Peut contenir autant de lignes que nécessaire. Chaque ligne est préfixée du Peut contenir autant de lignes que nécessaire. Chaque ligne est préfixée du
nom du script, jusqu'à la première ligne vide. Ensuite, les lignes sont nom du script, jusqu'à la première ligne vide. Ensuite, les lignes sont
affichées telles quelles. affichées telles quelles.
Le premier espace est ignoré, ce qui permet de spécifier des USAGEs avec une
option, e.g ' -c VALUE'
+|- +|-
: méthode d'analyse des arguments. : méthode d'analyse des arguments.
@ -241,7 +243,7 @@ function __parse_args() {
local first usage nl=$'\n' local first usage nl=$'\n'
local prefix=" $MYNAME " local prefix=" $MYNAME "
local usages="$__USAGE" local usages="${__USAGE# }"
[ -n "$usages" ] || usages="[options]" [ -n "$usages" ] || usages="[options]"
help="$help help="$help
@ -274,9 +276,7 @@ $prefix$usage"
esac esac
if [ -n "$first" ]; then if [ -n "$first" ]; then
first= first=
help="$help help="$help${nl}${nl}OPTIONS"
OPTIONS"
fi fi
# est-ce que l'option prend un argument? # est-ce que l'option prend un argument?
__witharg= __witharg=
@ -301,8 +301,7 @@ OPTIONS"
fi fi
if [ -n "$first" ]; then if [ -n "$first" ]; then
first= first=
help="$help help="$help${nl} "
"
else else
help="$help, " help="$help, "
fi fi
@ -313,8 +312,7 @@ OPTIONS"
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 help="$help${nl} ${1//$nl/$nl }"
$1"
shift shift
fi fi
done done

14
bash/tests/test-args-help.sh Executable file
View File

@ -0,0 +1,14 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname -- "$0")/../src/nulib.sh" || exit 1
#NULIB_NO_DISABLE_SET_X=1
args=(
"tester l'affichage de l'aide"
-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"
)
parse_args "$@"; set -- "${args[@]}"
enote "lancer le script avec --help pour afficher l'aide"