support --opt et --no-opt automatique

This commit is contained in:
Jephté Clain 2023-12-16 16:12:53 +04:00
parent d7323d7d45
commit 3def66748b
4 changed files with 45 additions and 15 deletions

View File

@ -30,10 +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.
les options --help et --help-all sont automatiquement gérées. avec --help, les options --help et --help++ sont automatiquement gérées. avec --help, seules
seules les options standards sont affichées. --help-all affiche toutes les les options standards sont affichées. --help++ affiche toutes les options. les
options. les descriptions sont utilisées pour l'affichage de l'aide. une option descriptions sont utilisées pour l'affichage de l'aide. une option avancée est
avancée est identifiée par une description qui commence par ++ 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
@ -84,6 +84,13 @@ action
-o,--short,--very-long . -o,--short,--very-long .
-o,--short,--very-long very_long -o,--short,--very-long very_long
~~~ ~~~
De plus, la valeur spéciale '.' traite les options de la forme --no-opt
comme l'inverse des option --opt. par exemple, les deux définitions
suivantes sont équivalentes:
~~~
--opt . --no-opt .
--opt opt --no-opt '$dec@ opt'
~~~
* 'NAME=VALUE' pour une option sans argument, forcer la valeur spécifiée; pour * 'NAME=VALUE' pour une option sans argument, forcer la valeur spécifiée; pour
une option avec argument, prendre la valeur spécifiée comme valeur par une option avec argument, prendre la valeur spécifiée comme valeur par
défaut si la valeur de l'option est vide défaut si la valeur de l'option est vide
@ -174,7 +181,7 @@ function __parse_args() {
__def="${__def#-}" __def="${__def#-}"
__lopts="$__lopts${__lopts:+,}$__def$__witharg" __lopts="$__lopts${__lopts:+,}$__def$__witharg"
fi fi
[ "$__def" == help -o "$__def" == help-all ] && __autohelp= [ "$__def" == help -o "$__def" == help++ ] && __autohelp=
done done
# sauter l'action # sauter l'action
shift shift
@ -184,7 +191,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,help-all" [ -n "$__autohelp" ] && __lopts="$__lopts${__lopts:+,}help,help++"
[ -n "$__sopts" ] || __sopts=? [ -n "$__sopts" ] || __sopts=?
__sopts="$__popt$__sopts" __sopts="$__popt$__sopts"
@ -201,14 +208,14 @@ function __parse_args() {
fi fi
## puis traiter les options ## puis traiter les options
local __defname __fixvalue __defvalue __add __action option_ name_ value_ local __defname __resvalue __decvalue __defvalue __add __action option_ name_ value_
function inc@() { function inc@() {
eval "[ -n \"\$$1\" ] || let $1=0" eval "[ -n \"\$$1\" ] || let $1=0"
eval "let $1=$1+1" eval "let $1=$1+1"
} }
function dec@() { function dec@() {
eval "[ -n \"\$$1\" ] && let $1=$1-1" eval "[ -n \"\$$1\" ] && let $1=$1-1"
eval "[ $1 -eq 0 ] && $1=" eval "[ \"\$$1\" == 0 ] && $1="
} }
function res@() { function res@() {
local __value="${value_:-$2}" local __value="${value_:-$2}"
@ -219,7 +226,7 @@ function __parse_args() {
eval "$1+=(\"\$__value\")" eval "$1+=(\"\$__value\")"
} }
function set@() { function set@() {
if [ -n "$__fixvalue" ]; then if [ -n "$__resvalue" ]; then
res@ "$@" res@ "$@"
elif [ -n "$__witharg" ]; then elif [ -n "$__witharg" ]; then
if is_array "$1"; then if is_array "$1"; then
@ -232,6 +239,8 @@ function __parse_args() {
[ -z "${!1}" ] && eval "$1=()" [ -z "${!1}" ] && eval "$1=()"
add@ "$@" add@ "$@"
fi fi
elif [ -n "$__decvalue" ]; then
dec@ "$@"
else else
inc@ "$@" inc@ "$@"
fi fi
@ -393,23 +402,28 @@ function __parse_opt() {
done done
__defname="${__defname//-/_}" __defname="${__defname//-/_}"
# analyser l'action # analyser l'action
__decvalue=
if [ "${1#\$}" != "$1" ]; then if [ "${1#\$}" != "$1" ]; then
name_="$__defname" name_="$__defname"
__fixvalue= __resvalue=
__defvalue= __defvalue=
__action="${1#\$}" __action="${1#\$}"
else else
if [ "$1" == . ]; then if [ "$1" == . ]; then
name_="$__defname" name_="$__defname"
__fixvalue= __resvalue=
__defvalue= __defvalue=
if [ "${name_#no_}" != "$name_" ]; then
name_="${name_#no_}"
__decvalue=1
fi
elif [[ "$1" == *=* ]]; then elif [[ "$1" == *=* ]]; then
name_="${1%%=*}" name_="${1%%=*}"
__fixvalue=1 __resvalue=1
__defvalue="${1#*=}" __defvalue="${1#*=}"
else else
name_="$1" name_="$1"
__fixvalue= __resvalue=
__defvalue= __defvalue=
fi fi
__action="$(qvals set@ "$name_" "$__defvalue")" __action="$(qvals set@ "$name_" "$__defvalue")"
@ -424,7 +438,7 @@ 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 elif [ "$option_" == --help++ ]; then
__action="showhelp@ ++" __action="showhelp@ ++"
return 0 return 0
fi fi

View File

@ -85,36 +85,42 @@ function assert_eq() {
local message; tests__set_message "$@" || shift $? local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3" [ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' and '$2' are not equals" [ -n "$message" ] || message="'$1' and '$2' are not equals"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -eq "$2" ] tests__assert "$message" ok [ "$1" -eq "$2" ]
} }
function assert_ne() { function assert_ne() {
local message; tests__set_message "$@" || shift $? local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3" [ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' and '$2' are equals" [ -n "$message" ] || message="'$1' and '$2' are equals"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -ne "$2" ] tests__assert "$message" ok [ "$1" -ne "$2" ]
} }
function assert_gt() { function assert_gt() {
local message; tests__set_message "$@" || shift $? local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3" [ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not greater than '$2'" [ -n "$message" ] || message="'$1' is not greater than '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -gt "$2" ] tests__assert "$message" ok [ "$1" -gt "$2" ]
} }
function assert_ge() { function assert_ge() {
local message; tests__set_message "$@" || shift $? local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3" [ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not greater than or equals to '$2'" [ -n "$message" ] || message="'$1' is not greater than or equals to '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -ge "$2" ] tests__assert "$message" ok [ "$1" -ge "$2" ]
} }
function assert_lt() { function assert_lt() {
local message; tests__set_message "$@" || shift $? local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3" [ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not less than '$2'" [ -n "$message" ] || message="'$1' is not less than '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -lt "$2" ] tests__assert "$message" ok [ "$1" -lt "$2" ]
} }
function assert_le() { function assert_le() {
local message; tests__set_message "$@" || shift $? local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3" [ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not less than or equals to '$2'" [ -n "$message" ] || message="'$1' is not less than or equals to '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -le "$2" ] tests__assert "$message" ok [ "$1" -le "$2" ]
} }

View File

@ -29,6 +29,7 @@ function pa() {
-b::,--oopt oopt= "spécifier oopt" -b::,--oopt oopt= "spécifier oopt"
-B::,--doopt doopt=default "spécifier doopt" -B::,--doopt doopt=default "spécifier doopt"
-n,--autoinc . "incrémenter autoinc" -n,--autoinc . "incrémenter autoinc"
-N,--no-autoinc . "décrémenter autoinc"
-v:,--autoval . "spécifier autoval" -v:,--autoval . "spécifier autoval"
-x: a1 "autoadd a1 qui n'est pas défini" -x: a1 "autoadd a1 qui n'est pas défini"
-y: a2 "autoadd a2 qui est défini à ()" -y: a2 "autoadd a2 qui est défini à ()"
@ -127,6 +128,13 @@ assert_eq "$autoinc" 2
pa -nnn pa -nnn
assert_eq "$autoinc" 3 assert_eq "$autoinc" 3
pa -nN
assert_z "$autoinc"
pa -nnN
assert_eq "$autoinc" 1
pa -nnnNN
assert_eq "$autoinc" 1
pa -v "" pa -v ""
assert_is_array autoval assert_is_array autoval
assert_array_same autoval "" assert_array_same autoval ""

View File

@ -13,4 +13,6 @@ nb: l'aide pour cette option doit faire 3 lignes indentées"
) )
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"
enote "lancer le script avec --help pour afficher l'aide" enote "lancer le script
- avec --help pour afficher les options standards uniquement
- avec --help++ pour afficher toutes les options"