[csh] Options

LCoileux -  
 LCoileux -
Bonjour,
je travaille actuellement sur un script prenant en paramètre des options, et j'ai des problemes pour verifier ces options. J'ai utilisé getopt, et au niveau de l'execution cela fonctionne bien. Cependant, si je veux voir si l'option est valide ou pas, mon code est:

if (($#argv == 3)&&(("-m" != $1)||("-l" != $1))) then
echo "ERREUR: l'option passée n'est pas valide"
exit(3)
endif

et lorsque j'essaie avec aussi bien n'importe quelle option que l'option -m, ce la me renvoie que l'option n'est pas valide. De plus, lorsque j'essaie avec -l, cela me renvoie "if: missing file name".
Comment faire ?

6 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

J'ai utilisé getopt, et au niveau de l'execution cela fonctionne bien.
On peut voir le code s'il te plaît ?

Et le script dans sa totalité tant qu'a y être...

Au fait, le csh c'est obligé ? C'est pas le plus simple ni ce qui se fait de mieux ;-(
0
LCoileux
 
Bonjour
voici le script en entier:

#! /bin/csh

unalias *

# Test des arguments

#Pas assez ou trop d'arguments
if (($#argv < 2 )||($#argv > 3)) then
        echo "ERREUR: Il faut passer deux arguments en paramètre"
        exit(1)
endif

#L'option passée en paramètre n'est pas valide
if (($#argv == 3)&&(("-m" != $1)||("-l" != $1))) then
    echo "ERREUR: l'option passée n'est pas valide"
    exit(3)
endif

#Le repertoire source n'existe pas ou n'est pas accessible
set opt = `getopt lm $argv`  
set l = 0
set m = 0
switch ($opt[1])
    case "-l":
        if ((!(-d $2)) || (!(-r $2)) || (!(-w $2))) then
            echo "ERREUR: le repertoire $2 n'existe pas ou n'est pas accessible"
            exit(2)
        endif
    breaksw

    case "-m":
        if ((!(-d $2)) || (!(-r $2)) || (!(-w $2))) then
            echo "ERREUR: le repertoire $2 n'existe pas ou n'est pas accessible"
            exit(2)
        endif
    breaksw

    default: 
        if ((!(-d $1)) || (!(-r $1)) || (!(-w $1))) then
            echo "ERREUR: le repertoire $1 n'existe pas ou n'est pas accessible"
            exit(2)
        endif
   breaksw
endsw

# Changement du nom du repertoire

switch ($opt[1])

#Cas où l'on fait appel à l'option -l
case "-l" :

   if ($2:t == " ") then 
                set rep = $2:h:t
           else set rep = $2:t
   endif

   if ($2 != $3) then
mv $rep $3
   endif
breaksw

#Cas où l'on fait appel à l'option -m
case "-m":

    if ($2:t == " ") then 
                set rep = $2:h:t
           else set rep = $2:t
    endif

    if ($2 != $3) then
        mv $rep $3
    endif
breaksw

#Cas sans options
default : 
    if ($1:t == " ") then 
                set rep = $1:h:t
           else set rep = $1:t
    endif

    if ($1 != $2) then
        mv $rep $2
    endif
breaksw
endsw

# Mise à jour des fichiers java

switch ($opt[1])

    #Cas où l'on fait appel à l'option -l
    case "-l":
        cd $3
        set liste = (`ls`)
            foreach i ($liste)
                if ($i:e == "java") then
                    if ("`head -1 $i`" == "`grep package $i`") then 
                        sed -i '1d' $i; sed -i '1i\package '$3';' $i
                        else
                        sed -i '1i\package '$3';' $i
                    endif
                endif
            end
    breaksw

    #Cas où l'on fait appel à l'option -m
    case "-m": 
        cd $3
        set liste = (`ls`)
            foreach i ($liste)
                if ($i:e == "java") then
                    if ("`head -1 $i`" == "`grep package $i`") then 
                        sed -i '1d' $i; sed -i '1i\package '$3';' $i
                        else
                        sed -i '1i\package '$3';' $i
                    endif
                endif
                if ($i:e == "class") then
                    rm $i
                endif
            end
     breaksw

    #Cas sans option
    default:
        cd $2
        set liste = (`ls`)
            foreach i ($liste)
                if ($i:e == "java") then
                    if ("`head -1 $i`" == "`grep package $i`") then 
                        sed -i '1d' $i; sed -i '1i\package '$2';' $i
                        else
                        sed -i '1i\package '$2';' $i
                    endif
                endif
            end
endsw
exit(0)


Et oui, malheureusement le csh est obligatoire....
Au niveau du script, je n'ai pas encore traiter l'option -l, vu que je bloque sur la validité de celles-ci.
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Re-

Essaye comme ça pour ton test de validité des paramètres (-l et -m), si c'est bon à la place du "OK" tu pourrais y incorporer la suite de ton script...
#L'option passée en paramètre n'est pas valide
if (("$1" == "-m") || ("$1" == "-l")) then
        echo "OK"
else
        echo "ERREUR: l'option passée n'est pas valide"
    exit(3)
endif
On se fiche du nombre de paramètres vu que tu l'as testé auparavant ;-))
0
LCoileux
 
Alors, cette modification ne marche que partiellement. En effet, lorsque je rentre comme option -l, il m'affiche toujours "if: missing file name".
De plus, je ne peux ignorer le nombre de parametres, car il peut y en avoir 2 ou 3, et c'est seulement dans le cas ou il y en a 3 qu'il faut tester l'option.
Merci quand meme !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 41342 Statut Modérateur 4 896
 
Ben chez moi que ce soit le "-l" ou le "-m" ça passe nickel ;-))
T'as bien mis "("$1" == "-l")" le paramètres en 1er dans le test ?

Sinon pour ton test des 3 paramètres, fais une condition "if" imbriquée :
if ($#argv == 3) then
if (("$1" == "-m") || ("$1" == "-l")) then
        echo "OK"
else
...
endif
else 
        echo "ERREUR: l'option passée n'est pas valide"
    exit(3)
endif
ou un truc du genre, non ?
0
LCoileux
 
Merci, ca marche, j'avais juste oublié les guillemets.
Autre chose, est-ce juste si, pour verifier que l'argument passé en paramètre est une option, je fait

"$1" == "-*"


car apparemment, il me cherche la chaine de caractère "-*" et non le symbole "-" suivi de n'importe quel caractère.
0