Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1385 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  {RESOLU}getopts et paramètre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

{RESOLU}getopts et paramètre

n°1593672
ptitcon
Posté le 31-07-2007 à 11:41:03  profilanswer
 

J'ai un petit soucis avec getopts, je l'utilise avec une seule option pour créer un mode debug dans un script. Le problème est que ce script reçoit déjà un argument,donc j'aimerai utilisé l'option pour getopt après le premier argument comme ceci :
 

Code :
  1. mon_script arg opt


 
Seulement, quand j'exécute mon script soit l'option est placée en premier et est traitée comme argument du script en plus d'être traité par getopts, soit elle est placée après et getopts ne la voit pas...
 
mon getopts :
 

Code :
  1. while getopts d variable
  2. do
  3. case $variable in
  4.   d)
  5.    VERBEUX="/logs/fichier.log"
  6.    DEBUG="/logs/fichier.log"
  7. ;;
  8. esac
  9. done


 
Peut-être faut-il mofifier $variable pour qu'il prenne le deuxième paramètre? (ça a pas eu l'air de marcher)
 
 :hello:

Message cité 1 fois
Message édité par ptitcon le 01-08-2007 à 09:48:36
mood
Publicité
Posté le 31-07-2007 à 11:41:03  profilanswer
 

n°1593830
Sve@r
Posté le 31-07-2007 à 15:25:14  profilanswer
 

ptitcon a écrit :

J'ai un petit soucis avec getopts, je l'utilise avec une seule option pour créer un mode debug dans un script. Le problème est que ce script reçoit déjà un argument,donc j'aimerai utilisé l'option pour getopt après le premier argument comme ceci :
 
Seulement, quand j'exécute mon script soit l'option est placée en premier et est traitée comme argument du script en plus d'être traité par getopts, soit elle est placée après et getopts ne la voit pas...


 
C'est tout à fait normal. Sur Unix/Linux, le fonctionnement des options est "normalisé" et doivent impérativement être placées avant les arguments de travail du programme (du script). Donc dès que getopts trouve un argument qui ne commence pas par "-", il considère qu'il a fini de bosser.
 
Pour résoudre ton problème, il faut que, une fois que getopts a fini de bosser, tu indiques à ton script de sauter les options traitées pour pas qu'elles soient à nouveau traitées comme argument. C'est faisable car getopts stocke le nombre de passes qu'il a exécutées dans la variable OPTIND (y compris la passe où il s'est apreçu qu'il avait fini). Donc "$OPTIND - 1" contient le nb d'options. Il te suffit donc de faire un shift de cette valeur

while getopts d opt
do
    case $opt in
       d) blablabla;;
    esac
done
shift `expr $OPTIND - 1`


ptitcon a écrit :

Code :
  1. mon_script arg opt



Non  :non:  
 
Tu lanceras ton script comme ceci

Code :
  1. mon_script arg


ou bien

Code :
  1. mon_script -d arg


 
Et si jamais tu voulais passer à ton script la valeur "-d" comme argument et non comme option, il te faudrait envoyer à getopts un indicateur spécifique indiquant "à partir de maintenant, il n'y a plus d'option et les valeurs même avec un tiret seront des arguments". Cet indicateur est le double tiret "--"

Code :
  1. mon_script -- -d


ou bien

Code :
  1. mon_script -d -- -d


Message édité par Sve@r le 31-07-2007 à 15:32:04

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1593837
ptitcon
Posté le 31-07-2007 à 15:36:54  profilanswer
 

Merci beaucoup..
Parce qu'en fait j'avais arrangé la chose avec mon argument.. Mais c'était pas propre du tout.
Du style
if [ "$1" = "-d" ]; then
arg=$2
else
arg=$1
fi
 
pas beau du tout

n°1594065
Sve@r
Posté le 31-07-2007 à 23:15:21  profilanswer
 

ptitcon a écrit :

Parce qu'en fait j'avais arrangé la chose avec mon argument.. Mais c'était pas propre du tout.
Du style
if [ "$1" = "-d" ]; then
arg=$2
else
arg=$1
fi
 
pas beau du tout


Ceci sera un poil plus beau: test "$1" = "-d" && arg=$2 || arg=$1
 
Sinon t'as un cours où tout ça est très bien expliqué ici http://fr.lang.free.fr/cours/Shell_v2.0.pdf
getopts p.53 et getopt p.62


Message édité par Sve@r le 31-07-2007 à 23:23:26

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1594207
ptitcon
Posté le 01-08-2007 à 09:50:37  profilanswer
 

Merci sve@r, pas bête comme idée mais ça reste pas très beau, ta première solution reste de loin la plus correcte. Ça tourne rond.
 
Merci pour le lien.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  {RESOLU}getopts et paramètre

 

Sujets relatifs
[Résolu] Erreur AJAX[résolu] une page dans une autre page ?
Resolu [VBS] lister les connexions TCP (comme netstat)[Résolu]C# Icon notification
[RESOLU] Signal SIGABRT dans mon programme sous Ubuntu[Résolu] MySql : Dernière entrée qui apparait en premier?
[Resolu] repaint(), je comprends pas.[Résolu] Problème de décalage de date java sous windows vista
[résolu] extraction du nom de fichier d'une url[RESOLU] MySQL jointure sur clé primaire LENTE
Plus de sujets relatifs à : {RESOLU}getopts et paramètre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR