support --opt et --no-opt automatique
This commit is contained in:
parent
d7323d7d45
commit
3def66748b
|
@ -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
|
||||||
|
|
|
@ -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" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 ""
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue