{RESOLU}getopts et paramètre

{RESOLU}getopts et paramètre - Shell/Batch - Programmation

Marsh Posté le 31-07-2007 à 11:41:03    

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
Reply

Marsh Posté le 31-07-2007 à 11:41:03   

Reply

Marsh Posté le 31-07-2007 à 15:25:14    

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

Marsh Posté le 31-07-2007 à 15:36:54    

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

Reply

Marsh Posté le 31-07-2007 à 23:15:21    

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

Marsh Posté le 01-08-2007 à 09:50:37    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed