Options de ligne de commande complexes [optionnelles, obligatoires, exclusives...] sous bash
1 réponse
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) ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
"Fabrice" <fabrice.baro@gmail.com> 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.
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.