Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Options de ligne de commande complexes [optionnelles, obligatoires, exclusives...] sous bash

1 réponse
Avatar
Fabrice
Je cherche =E0 parser un certain nombre d'options sur la ligne de
commande d'un script.
Bon, j'ai d=E9j=E0 fait des recherches, j'utilise getopts. Mais il me
manque certaines fonctionnalit=E9s.
Voici mon code pour l'instant:
while getopts ":s:1dgh" option
do
case $option in
s) seuil=3D$OPTARG;;
1) one_dir;;
d) directory;;
g) global;;
h) usage;;
'?')echo "-$OPTARG: unknown option."
exit 1;;
:) echo "-$OPTARG: requires an argument"
exit 1;;
esac
done

Le : dans "s:" dit que l'option -s n=E9cessite un argument. =C7a c'est
ok.

Dans mon cas, les options 1, d et g sont exclusives. J'aimerais
v=E9rifier qu'une et une seule est pr=E9sente, puis ex=E9cuter la fonction
appropri=E9e.

Pour une option "optionnelle", je pense que =E7a se fait par d=E9faut: si
on l'appelle pas sur la ligne de commande, elle n'est pas ex=E9cut=E9e
dans le "case".

Autre question, comment je peux traiter des arguments sans option avant
(ex: je veux passer le nom d'un fichier n'importe o=F9 en param=E8tre,
mais sans avoir =E0 le pr=E9c=E9der d'un -f par exemple) ?

1 réponse

Avatar
Pascal Bourguignon
"Fabrice" writes:

Je cherche à parser un certain nombre d'options sur la ligne de
commande d'un script.
Bon, j'ai déjà fait des recherches, j'utilise getopts. Mais il me
manque certaines fonctionnalités.
Voici mon code pour l'instant:
while getopts ":s:1dgh" option
do
case $option in
s) seuil=$OPTARG;;
1) one_dir;;
d) directory;;
g) global;;
h) usage;;
'?')echo "-$OPTARG: unknown option."
exit 1;;
:) echo "-$OPTARG: requires an argument"
exit 1;;
esac
done

Le : dans "s:" dit que l'option -s nécessite un argument. Ça c'est
ok.

Dans mon cas, les options 1, d et g sont exclusives. J'aimerais
vérifier qu'une et une seule est présente, puis exécuter la fonction
appropriée.



Garde une seule variable:

diropt=1 # default
...
case $option in
...
[1dg]) diropt=$option ;;
...

Tu peux accepter que l'utilisateur passe plusieurs options, et la
dernière est la bonne. Ça facilite les scripts et les alias.


Sinon:

diropt=i # indefini
...
case $option in
...
[1dg]) [ $diropt = i ] && diropt=$option || erreur "$diropt incompatible avec $option" ;;
...


Pour une option "optionnelle", je pense que ça se fait par défaut: si
on l'appelle pas sur la ligne de commande, elle n'est pas exécutée
dans le "case".


Voir ci-dessus.


Autre question, comment je peux traiter des arguments sans option avant
(ex: je veux passer le nom d'un fichier n'importe où en paramètre,
mais sans avoir à le précéder d'un -f par exemple) ?


$ cat ~/src/miscellaneous/shell/getopts
#!/bin/bash
while [ $OPTIND -le $# ] ; do
while getopts "hf:" option ; do
echo "$OPTIND : $option --> $OPTARG"
done
if [ $OPTIND -le $# ] ; then # process unknown option
echo "Random file: ${!OPTIND}"
shift # or: OPTIND=$(( $OPTIND + 1 ))
fi
done

$ ~/src/miscellaneous/shell/getopts tata -h titi -f titi tutu
Random file: tata
2 : h -->
Random file: titi
4 : f --> titi
Random file: tutu

--
__Pascal Bourguignon__ http://www.informatimago.com/
You never feed me.
Perhaps I'll sleep on your face.
That will sure show you.