Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 10/03/2010, 15h36   #1
Futur Membre du Club
 
Inscription : septembre 2006
Messages : 86
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 86
Points : 17
Points : 17
Par défaut Gerer les options d'un script

Bonjour,

Dans mon script "test.sh" je souhaiterais verifier les options et leurs valeures associés avec la function getopts. Voila le code:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
if [ $# -eq 1 -a "$1" = -h ]; then
        usage
      fi
 
while getopts ":c:n:" option
do
case $option in
 c)
   if [ -n $OPTARG ]; then
     print "ERROR: You must provide a TRUE or FALSE to indicate your need: "
     usage
       else
    identifyClearedTraps "$OPTARG"
   fi
   ;;
 n)
   NB_TRAPS="$OPTARG"
   ;;
 \?) echo " option $OPTARG  INVALIDE" >&2
     E_OPTION=3
esac
done
shift $(($OPTIND - 1))
 
cmd1
cmd2
cmd3
.....
Et voila mes questions:
Question 1:
Si j'appele mon script de la facon suivante: le script est appelé sans erreur et tous mes commandes sont executés malgré que l'option n'est pas valide. Par contre, si je l'appele comme suit : là j'ai un message d'erreur m'indiquant que l'option n'est pas valide.

Comment je dois faire pour que dans les deux cas j'aurrai le message d'erreur ?

Question 2:
dans la ligne :
Code :
while getopts ":c:n:" option
le : apres "c" et "n" signifie que ces deux options ont des valeures associés. Si j'appele mon scritp avec l'option mais sans specifié une valeur associée, j'ai l'impression que le script n'execute pas les commandes specifiés dans . Pourquoi ?


Merci en avance
kass28 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/03/2010, 16h37   #2
Membre Expert
 
Homme
budget et contrôle de gestion
Inscription : décembre 2006
Messages : 865
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 44
Localisation : France

Informations professionnelles :
Activité : budget et contrôle de gestion
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : décembre 2006
Messages : 865
Points : 1 320
Points : 1 320
Salut,

ici
Code :
 \?) echo " option $OPTARG  INVALIDE" >&2
il me semble que ce devrait être
Code :
 *) echo " option $OPTARG  INVALIDE" >&2
__________________
Winnt

C'est en Linuxant qu'on devient .... geek

Intel Core i5 750 / 8 Go ram / Hdd 2 To / NVIDIA GeForce GTS 250 1Go sous Gentoo.
Dual core E6300 / 2Go ram / Hdd 1 To / Ati 9800XT sous Debian Testing.
Atom N330 / 4Go ram / Hdd 5To / intel GMA 950 sous Debian Testing
Winnt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 01h16   #3
Invité régulier
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 6
Points : 6
Avec getopts, le \? serait même à remplacer par [?]
deupac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2010, 01h23   #4
Invité régulier
 
Inscription : septembre 2009
Messages : 12
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 12
Points : 6
Points : 6
pour la réponse à ta question 2, essaye en remplacant :

Code :
while getopts ":c:n:" option

par


Code :
while getopts c:n: option
deupac est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2010, 18h16   #5
Nouveau Membre du Club
 
David
Inscription : avril 2009
Messages : 26
Détails du profil
Informations personnelles :
Nom : David
Âge : 40

Informations forums :
Inscription : avril 2009
Messages : 26
Points : 27
Points : 27
Salut,

Réponse à la question 1 :
Code :
1
2
3
4
5
6
Si j'appele mon script de la facon suivante:
Code :
 
./test.sh t
 
Dans ce cas là, le script est appelé sans erreur et tous mes commandes sont executés malgré que l'option n'est pas valide.
le "t" est considéré comme paramètre et non comme option, ton script test.sh est donc lancé sans option. Une option doit toujours être précédé d'une tiret "-".

Ci-dessous, affichage des erreurs :
- lors de l'oubli d'option,
- Si le premier paramètre n'est pas une option.
Code :
1
2
3
4
5
6
7
8
9
10
11
if [ "$(echo $* | grep \- | wc -l)" = 0 ]
then
  echo "le script $(basename $0) a besoin d option, pour de plus amples informations, utilisez :"
  echo "$(basename $0) -h  ou  $(basename $0) --help"
  exit
elif [ "$(echo $1 | grep \- | wc -l)" = 0 ]
then
  echo "L'option doit preceder les parametres, pour de plus amples informations, utilisez :"
  echo "$(basename $0) -h  ou  $(basename $0) --help"
  exit
fi
syjis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2010, 14h39   #6
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 38
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
et quelque chose comme ceci :
Code :
1
2
3
4
5
6
7
8
   while getopts t:a: option
   do
      case $option in
         t) option "-t" ;;
         a) option "-a" ;;
         *) mauvaise option;;
      esac
   done
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/03/2010, 15h00   #7
Membre Expert
 
Avatar de jabbounet
 
frederic frances
Inscription : juin 2009
Messages : 1 693
Détails du profil
Informations personnelles :
Nom : frederic frances
Âge : 36

Informations forums :
Inscription : juin 2009
Messages : 1 693
Points : 2 068
Points : 2 068
Attention le ":" après une lettre signifie que l'option associé reçoit u argument


petit exemple venant de
http://docs.sun.com/app/docs/doc/816...6nb7mam?a=view
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
set -- `getopt abo: $*`
if [ $? != 0 ]
then
           echo $USAGE
           exit 2
fi
for i in $*
do
           case $i in
           -a | -b)     FLAG=$i; shift;;
           -o)           OARG=$2; shift 2;;
           --)           shift; break;;
           esac
done
ainsi que les utilisation possible
Code :
1
2
3
4
5
 
cmd -aoarg filename1 filename2
cmd -a -o arg filename1 filename2
cmd -oarg -a filename1 filename2
cmd -a -oarg -- filename1 filename2
jabbounet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 10h59.


 
 
 
 
Partenaires

Hébergement Web