Votre navigateur est obsolète. Téléchargez un navigateur moderne, par exemple FireFox.
Léa-Linux : Forum
Le forum de Léa abrite des discussions autour des Logiciels libres.
Syndication
  • RSS ForumForum complet
  • RSS Forum - DéveloppementForum - Développement
  • RSS Forum - Développement - 130222Cette discussion

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.

Important : quand vous posez une question, n'oubliez pas de nous donner les indications suffisantes pour que nous puissions répondre. En effet, la divination n'est pas le fort du Linuxien averti. Pour une meilleure compréhension, le bon usage de la grammaire et de l'orthographe est fortement encouragé. En particulier, le langage SMS est à éviter absolument. En cas d'abus, il pourra être censuré sans autre forme de procès.
Les messages dont le contenu est illégal (incitant à la haine - raciale ou autre, diffamant), ou dont le contenu est sans rapport avec le sujet du forum, ou qui sont parfaitement stupides ou hors sujet seront supprimés sans pitié. Il pourra même être fait appel au fournisseur d'accès du coupable pour faire cesser ses agissements.
» Index du forum » Développement » Problème de prog en SHELL (sh) sous Linux
Aller à la discussion: PrécédentSuivante
Action: Nouveau sujetChercherS'authentifier
Problème de prog en SHELL (sh) sous Linux
Auteur: Neo (IP enregistrée)
Date: le 11 décembre 2003 à 15:02

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 image : fache
###############################################################

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

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: lechabin (IP enregistrée)
Date: le 11 décembre 2003 à 16:06

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.

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: Neo (IP enregistrée)
Date: le 11 décembre 2003 à 16:42

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

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: alveric (IP enregistrée)
Date: le 11 décembre 2003 à 16:45

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
?

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: Neo (IP enregistrée)
Date: le 11 décembre 2003 à 17:33

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 image : content

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: alveric (IP enregistrée)
Date: le 12 décembre 2003 à 00:50

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

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: Neo (IP enregistrée)
Date: le 16 décembre 2003 à 00:10

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

A bientôt !

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: lechabin (IP enregistrée)
Date: le 16 décembre 2003 à 01:39

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

Re: Problème de prog en SHELL (sh) sous Linux
Auteur: alveric (IP enregistrée)
Date: le 16 décembre 2003 à 11:17

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



Nom du forum : (antispam) - (en développement:saisir un texte pour le message, rempli cette zone automatiquement)
Votre nom: 
Votre email: 
Sujet: 

 
Ce forum est boosté par Phorum.