#1 Le 16/07/2021, à 21:17
- Nuliel
[Résolu] parser les paramètres passés à un script
Bonjour,
J'ai eu besoin aujourd'hui de parser les paramètres qui sont passés à un script, et à la base je voulais un truc assez simple: récupérer des paramètres longs (--debug, --ptrace, --cli)
Et en cherchant, j'ai découvert qu'il y a 15 000 méthodes pour parser les paramètres:
- avec getopts (supporte que des paramètres courts)
- avec getopt (si j'ai bien compris retransforme mais parse pas)
- avec une boucle contenant un switch case suivi d'un shift pour pouvoir passer à l'argument suivant
- et plein d'autres, plus ou moins incompréhensibles pour moi
Mais que la plupart de ces méthodes (notamment getopts) ne gèrent que les paramètres courts.... Du coup je me suis rabattu sur cette solution
INSTALLING_IN_CLI=
DEBUG=
PTRACE=0
while getopts cdp flag
do
case $flag in
c) INSTALLING_IN_CLI=1;;
d) DEBUG="-DDEBUG";;
p) PTRACE=1;;
esac
done
mais c'est pas ce que je voulais (à la base je voulais utiliser des paramètres longs).
Quelle est pour vous la méthode la plus propre et la plus complète (par complet je veux dire supportant paramètres courts (-v), longs(--verbose), avec valeur associée au paramètre (--verbose=1), qu'il y ait un paramètre court associé (-v = --verbose), et qui si possible permet d'accéder facilement aux arguments restants qui ne sont pas des paramètres) pour parser les arguments d'un script bash?
En C on peut faire ça avec getopt_long (qui est vraiment génial), y a t'il un équivalent en bash?
Merci d'avance,
Nuliel
Dernière modification par Nuliel (Le 17/07/2021, à 12:59)
Hors ligne
#2 Le 17/07/2021, à 06:54
- nany
Re : [Résolu] parser les paramètres passés à un script
Bonjour,
verbose=0
help=0
usage ()
{
echo -e "\\033[1;41m""Usage:""\\033[0;39m"" ""\\033[1;39m"\
echo -e "\\033[0;39m"" $0 ""\\033[0;36m""[-v | --verbose | -h | --help]"
}
while getopts ":vh-:" flag
do
if [[ "$flag" = "-" ]] ; then
case "${OPTARG%%=*}" in
verbose)
flag="v"
;;
help)
flag="h"
;;
*)
usage
exit 1
;;
esac
fi
case "$flag" in
v)
verbose=1
;;
h)
help=1
;;
\?)
usage
exit 1
;;
esac
done
?
Dernière modification par nany (Le 17/07/2021, à 06:55)
En ligne
#3 Le 17/07/2021, à 06:59
- Watael
Re : [Résolu] parser les paramètres passés à un script
le if n'est pas indispensable :
case $flag in
a) ...;;
b) ...;;
-) case $OPTARG in
longue1) ...;;
longue2) ...;;
esac
esac
Dernière modification par Watael (Le 17/07/2021, à 07:00)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 17/07/2021, à 10:01
- Nuliel
Re : [Résolu] parser les paramètres passés à un script
Merci à vous deux.
Si je comprends bien, la solution de nany est basée sur getopts qui ne gère que les paramètres courts, sauf que le paramètre testé est - , et on récupère comme argument associé au paramètre le reste du paramètre long. J'ai testé et c'est impec! J'aurais quelques questions dessus:
Je ne comprends pas le if [[ "$flag" = "-" ]]. En fait je ne comprends pas comment getopts fait vu qu'il attend comme paramètre v ou h. Ou le reste du paramètre est dans OPTARG? Dans ce cas là, on ne peut pas se passer du if non?
Il y a un case pour reconnaître les paramètres longs et les transformer en paramètre court (en modifiant flag), et un pour s'occuper des paramètres courts? getopts va pas être perdu si on modifie flag?
${OPTARG%%=*} permet de retirer le =true dans --verbose=true? C'est ce que je comprends de https://tldp.org/LDP/abs/html/parameter … ution.html
Dernière modification par Nuliel (Le 17/07/2021, à 10:03)
Hors ligne
#5 Le 17/07/2021, à 12:16
- nany
Re : [Résolu] parser les paramètres passés à un script
Je ne comprends pas le if [[ "$flag" = "-" ]]. En fait je ne comprends pas comment getopts fait vu qu'il attend comme paramètre v ou h. Ou le reste du paramètre est dans OPTARG? Dans ce cas là, on ne peut pas se passer du if non?
Regarde bien mon exemple, getopts attend v, h ou -.
OPTARG est ce qui suit le paramètre.
Et oui on peut se passer du if comme l’a montré Watael.
Il y a un case pour reconnaître les paramètres longs et les transformer en paramètre court (en modifiant flag), et un pour s'occuper des paramètres courts? getopts va pas être perdu si on modifie flag?
On est dans une boucle (while) donc chaque paramètre est traité l’un après l’autre.
${OPTARG%%=*} permet de retirer le =true dans --verbose=true? C'est ce que je comprends de https://tldp.org/LDP/abs/html/parameter … ution.html
Tu as bien compris.
En ligne
#6 Le 17/07/2021, à 12:47
- MicP
Re : [Résolu] parser les paramètres passés à un script
Bonjour
@Nuliel
Avec l'interpréteur de commandes bash
michel@debbull:~$ maVar="Premier=deuxième=troisième=dernieR"
michel@debbull:~$ echo ${maVar%%=*}
Premier
michel@debbull:~$ echo ${maVar%=*}
Premier=deuxième=troisième
michel@debbull:~$ echo ${maVar##*=}
dernieR
michel@debbull:~$ echo ${maVar#*=}
deuxième=troisième=dernieR
michel@debbull:~$
Dernière modification par MicP (Le 17/07/2021, à 13:25)
Hors ligne
#7 Le 17/07/2021, à 12:59
- Nuliel
Re : [Résolu] parser les paramètres passés à un script
ok, getopts retire le premier tiret, et s'attend donc à trouver soit v, soit h, soit - qui sera complété par OPTARG.
Merci MicP pour l'exemple, c'est plus clair pour moi.
Du coup le code sans le if:
verbose=0
help=0
usage ()
{
echo -e "\\033[1;41m""Usage:""\\033[0;39m"" ""\\033[1;39m"\
echo -e "\\033[0;39m"" $0 ""\\033[0;36m""[-v | --verbose | -h | --help]"
}
while getopts ":vh-:" flag
do
case $flag in
v)
verbose=1
;;
h)
help=1
;;
\?)
usage
exit 1
;;
-) case $OPTARG in
verbose)
verbose=1
;;
help)
help=1
;;
*)
usage
exit 1
;;
esac
esac
done
echo "verbose: $verbose"
echo "help: $help"
Merci à vous 3, je passe le sujet en résolu
Hors ligne
#8 Le 17/07/2021, à 15:31
- MicP
Re : [Résolu] parser les paramètres passés à un script
Pour ta fonction usage
je te propose :
usage () { echo -e "\n\033[1;41mUsage :\033[0m ${0##*\/} \033[0;36m[-v | --verbose | -h | --help]\033[0m\n"; }
Dernière modification par MicP (Le 18/07/2021, à 03:32)
Hors ligne
#9 Le 17/07/2021, à 15:41
- Nuliel
Re : [Résolu] parser les paramètres passés à un script
Impec cette fonction usage!
Tiens, ça me fait penser que je pourrais mettre un peu de couleur à ma variable PS1
Pas bête ${0##*\/} pour garder que le nom du programme, il y a aussi $(basename $0) qui je pense revient au même, mais qui n'est pas un builtin
Hors ligne
#10 Le 17/07/2021, à 16:54
- MicP
Re : [Résolu] parser les paramètres passés à un script
Pour rendre un peu plus lisible les pages man
tu peux ajouter ce bloc de lignes à la fin de ton fichier ~/.bashrc
# Pager less en couleurs => man pages en couleurs
# Voir :
# man termcap
# man console_codes
#
export \
LESS_TERMCAP_mb=$'\033[1;31m' \
LESS_TERMCAP_md=$'\033[1;38;5;74m' \
LESS_TERMCAP_me=$'\033[0m' \
LESS_TERMCAP_se=$'\033[0m' \
LESS_TERMCAP_so=$'\033[1;44;33m' \
LESS_TERMCAP_ue=$'\033[0m' \
LESS_TERMCAP_us=$'\033[1;32m'
Dernière modification par MicP (Le 17/07/2021, à 16:54)
Hors ligne
#11 Le 17/07/2021, à 17:41
- Nuliel
Re : [Résolu] parser les paramètres passés à un script
C'est maintenant fait, et c'est déjà plus agréable à lire!
Dernière modification par Nuliel (Le 17/07/2021, à 17:41)
Hors ligne
#12 Le 17/07/2021, à 17:58
- Watael
Re : [Résolu] parser les paramètres passés à un script
je me souviens, c'était hier, j'ai eu l'impression que quelqu'un avait apporté le bon éclairage dans les profondeurs du terminal.
eh, il suffisait d'allumer la lumière !
Dernière modification par Watael (Le 17/07/2021, à 17:59)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 18/07/2021, à 07:06
- Tawal
Re : [Résolu] parser les paramètres passés à un script
Ah oui ! Super les couleurs pour les pages man.
Merci MicP
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#14 Le 18/07/2021, à 11:56
- ylag
Re : [Résolu] parser les paramètres passés à un script
Bonjour,
Pour rendre un peu plus lisible les pages man
tu peux ajouter ce bloc de lignes à la fin de ton fichier ~/.bashrc# Pager less en couleurs => man pages en couleurs # Voir : # man termcap # man console_codes # export \ LESS_TERMCAP_mb=$'\033[1;31m' \ LESS_TERMCAP_md=$'\033[1;38;5;74m' \ LESS_TERMCAP_me=$'\033[0m' \ LESS_TERMCAP_se=$'\033[0m' \ LESS_TERMCAP_so=$'\033[1;44;33m' \ LESS_TERMCAP_ue=$'\033[0m' \ LESS_TERMCAP_us=$'\033[1;32m'
Encore merci à MicP ; j'utilise depuis un bon moment autant sur Ubuntu que Debian...
A+
Hors ligne