Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Problème de prog en SHELL (sh) sous Linux
Envoyé par: Neo

Bonjour ,

Je suis en train de developper un script en Shell (SH) pour Linux.
J'ai un gros problème sur lequel j'ai planché pendant plusieurs heures, voire
plusieur journées, en vain.

Je vous serai très reconnaissant si vous pouviez me depanner à
trouver l'algorithme correct en Bash (SH)

Tous les paramètres du programme sont rentrés en ligne de commande.
Leur nombre n'est pas connu à l'avance bien sûr !

Je ne trouve d'algorithme comparable à celui qui est realise lorsque l'on
execute un "ls -l" ou un "find . -type f -name "*.c"

Dans mon cas, je souhaiterai traiter les arguments rentres en ligne de commande
en suivant ce shema :

// Appel du programme : "./monprog <argument1> <argument2> <...>"

// Shema :

- Option "-C <arg1>" -> appelle fonction "F1 <arg1>"
- Option "-i <arg2>" -> fonctionne uniquement avec option -C
appelle fonction "F1 <arg1> <arg2>
- Option "-s <arg3>" -> fonctionne uniquement avec option -C
appelle fonction "F1 <arg1> <...> <arg3>
- Option "-d <arg4>" -> fonctionne uniquement avec option -C
appelle fonction "F1 <arg1> <...> <arg4>


// Exemple : l'appel "./monprog -C toto -i fifi -s lala" doit
executer la fonction "F1 toto fifi lala"

- Option "-l <arg4> <arg...>" -> appelle une fonction "F2" avec comme
paramètre au moins un argument.

// Exemple : l'appel "./monprog -l math opengl stdlib -C toto -s lala" doit
executer la fonction ---> "F2 math opengl stdlib"
puis la fonction ---> "F1 toto _rien lala"

###############################################################
################ Voici ce que j'ai deja essayé de programmer,
################ mais bien sur, ca ne marche pas :-(
###############################################################

while test $# -ne 0
do
case $1 in
"-t") res=`echo "$2"|grep -E "^-"`;
if [ $? -ne 0 ]
then
verrifStructureProjet $2
else
echo "inco";break;
fi
shift;;

"-o")
test $t1 = 1 -a -z $t2
while [ $? -eq 0 ]
do
res=`echo "$2"|grep -E "^-"`;
echo "kkk "
done

t1=$?
if [ $t1 -ne 0 ]
then
test -z "$2"
t2=$?
if [ $t2 -eq 0 ]
then
echo "bye";break;
else
fixeLibrairies $2
fi
else
echo "bye";break;
fi
shift;;

"-C") res=`echo "$2"|grep -E "^-"`;
if [ $? -ne 0 ]
then
test -z "$2"
if [ $? -eq 0 ]
then
echo "bye";break;
else
nomFich="$2";
test $3 != "-i" -a $3 != "-s" -a $3 != "-d" -a $3 != "-O";
echo "----- $?"
case $3 in
"-i") test -z "$4"
if [ $? -ne 0 ]
then
testeArg $4 inc;
else
break;
fi;;
"-s") test -z "$4"
if [ $? -ne 0 ]
then
testeArg $4 src;
else
break;
fi;;
"-d") test -z "$4"
if [ $? -ne 0 ]
then
testeArg $4 dat;
else
break;
fi;;
"-O") test -z "$4"
if [ $? -ne 0 ]
then
testeArg $4 obj
else
break;
fi;;
esac
creeStructureProjet $nomFich $varInc $varSrc $varObj $varDat;
fi
else
echo "inco";break;
fi
shift
esac
shift
echo "++"
done

Poste le Thursday 11 December 2003 15:02:58
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: lechabin

je n'ai fait que survole ton script , mais je n'ai pas vu de 'getopt'
c'est cette commande qu'il faut que tu utilises si tu as des options apres une commande
bon je n'ai pas de tmps de m'y remettre mais c'est deja une piste.

Poste le Thursday 11 December 2003 16:06:48
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: Neo

Merci pour ton aide :-)
Je vais essayer avec ta commande -GETOPT-. N'existe t-il pas un script deja existant pour ce genre de problématique ?

Poste le Thursday 11 December 2003 16:42:21
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: alveric

Quand tu dis que ça marche pas, ça fait quoi exactement ?

---
Dans le filtre "-o" :
#while [ $? -eq 0 ]
#do
#res=`echo "$2"|grep -E "^-"`;
#echo "kkk "
#done
#
#t1=$?
Quel que soit le résultat du grep, le echo renverra un code 0, donc le while ne s'éxécute au plus qu'une fois, ce qui fait que ce n'est qu'un if...then...fi.
De plus, c'est quelle fonction qui modifie le $? en dernier avant qu'il ne soit pris par t1 ? echo ou while ?

---
À plusieurs endroits, tu utilises
#test <condition>
#if [ $? -ne 0 ]
#then <...> fi

Ça serait pas plus simple de faire
# if test ! <condition>
# then <...> fi
?

Poste le Thursday 11 December 2003 16:45:19
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: Neo

Voila, je souhaite simplement traiter les arguments en ligne de commande.
Le problème, c'est que ca ne se retout pas avec un CASE $i IN... puisque les regles sont assées compliquees.

Certains filtres acceptent plusieurs arguments
Certains filtres n'acceptent aucun argument
Certains filtres ne peut etre utilisees que si un certain filtre a ete utilisé
(---> voir debut du message)

Je suis debutant en prog, et je n'arrive pas à trouver l'algo correct à utiliser dans mon cas.

Merci d'avance pour vos reponses :-)

Poste le Thursday 11 December 2003 17:33:04
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: alveric

J'ai déjà fait ce genre de choses pour des scripts (mais pas à ce niveau). Comme ça, je peux improviser quelques idées, mais pour les détails je garantis pas...

while $# != 0 ; do
case $1 in

# un filtre qui attend plusieurs parametres
"-filtre1" ) if [[ $# -ge n ]]
then
PARAM_FILTRE1_1=$1 ; switch ;
(...)
PARAM_FILTRE1_N=$1 ; switch ;
<ce que tu veux avec les n param> ;
else
echo "-filtre1 attend n paramètres"
exit 1
fi ;;

# un filtre qui n'attend aucun parametres
"-filtre2" ) <nimporte_quoi>; switch ;;

# un param qui dépend de la présence d'un autre (codé comme suit, il faut que le filtre 3 soit donné avant le 4 sur la ligne de commande)
"-filtre3" ) <nimporte_quoi>; FILTRE3=1; switch ;;
"-filtre4" ) if [[ $FILTRE3 == 1 ]]
then
<nimporte_quoi>
else
echo "-filtre4 ne peut être défini que si -filtre3 est déjà défini."
exit 1
fi;
switch ;;

# et si le param est n'importe quoi...
* ) echo "mauvais paramètre" ;
exit 1 ;;
esac
done

-------

Et, par hasard, si PARAM_FILTRE1_2 doit être une fichier existant, ou vérifier n'importe quelle condition:
(...)
PARAM_FILTRE1_1=$1; switch ;
if [ -f $1 ] ; then
PARAM_FILTRE1_2=$1 ; switch;
else
echo "Le 2e param de -filtre1 doit être un fichier."
exit 1
fi ;
PARAM_FILTRE1_3 (...)

----
Un truc que j'aime bien faire, c'est prévoir des codes d'erreurs différents pour chaque cas (ce que j'ai pas fait au-dessus), comme ça on peut le réutiliser assez finement dans d'autres scripts...

Ou encore rediriger les messages d'erreurs sur la "sortie d'erreur" (stderr) avec des
echo "message_erreur" >&2

Mais là c'est pour faire vraiment propre, c'est pas forcément nécessaire pour de petits scripts...

Poste le Friday 12 December 2003 00:50:36
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: Neo

Merci beaucoup pour ton aide :-) Je vais étudier ton code et l'adapter à mon script ...

A bientôt !

Poste le Tuesday 16 December 2003 00:10:11
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: lechabin

bon pkoi tu ne veux pas utiliser getopts qui te facilitera la tache
par exemple tu ecris
./ex.sh -a -l ou ./ex.sh -al
alors dans ton script tu vas gerer les deux avec getopts
!/bin/sh
while getopts "al" option; do
case $option in
a ) echo option A ;;
l ) echo option l ;;
esac
done
voila voila apres tu fais ce que tu veux

Poste le Tuesday 16 December 2003 01:39:40
Répondre     Citer    
Re: Problème de prog en SHELL (sh) sous Linux
Envoyé par: alveric

oups.. j'ai mis plein de "switch" au lieu de "shift"... boulèèèèèèt.

Poste le Tuesday 16 December 2003 11:17:03
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Problème de prog en SHELL (sh) sous Linux
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons