Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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)

Hors 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

Nuliel a écrit :

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.

Nuliel a écrit :

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.

Nuliel a écrit :

${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.

Hors 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 smile
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. smile
eh, il suffisait d'allumer la lumière ! big_smile

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. cool

Merci MicP smile


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,

MicP a écrit :

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... smile

A+

Hors ligne