Pages : 1
#1 Le 27/11/2008, à 17:01
- Mr.Photoshop
Programme tous simple Shell
Salut à tous ,
alors voilà j'ai un petit problème , j'ai un petit script à faire : il doit , si le fichier envoyé en paramètre est un .c , appeller gcc , sinon si c'est un .cc , appeller g++ .
fichier=$1
testc=`basename $fichier .c`
testcc=`basename $fichier .cc`
if [ $testc!=$fichier ]
then gcc $fichier -o $testcelif [ $testcc!=$fichier ]
then g++ $fichier -o $testccelif [ test -f $fichier ]
then echo "ce type de fichier n'est pas pris en charge"else echo "le fichier n'existe pas"
fi
Merci d'avance pour votre aide ,
Hors ligne
#2 Le 27/11/2008, à 18:26
- AnsuzPeorth
Re : Programme tous simple Shell
Bjr,
Je ne sais pas si c'est t'aider que de te donner la réponse toute cuite. C'est un exercise pour tes cours ?
Je suis débutant, mais je m'y prendrai comme ça:
recupération du fichier passer en argument et en extraire l'extension (avec cut par exemple)
ensuite une simple comparaison de l'extension !
attention au espace autour du '='
if [ "$nom" = "c" ]; then
gcc ........ (trouve le reste, c tres simple)
#3 Le 27/11/2008, à 18:37
- Mr.Photoshop
Re : Programme tous simple Shell
J'y avais déjà pensé , mais la je ne comprends pas , quand j'execute le code il rentre directement dans le premier if , comme si c'était toujours vrai ...
On peut comparer des noms comme ça au moins ?
Merci pour ton aide en tout cas
Hors ligne
#4 Le 27/11/2008, à 18:44
- AnsuzPeorth
Re : Programme tous simple Shell
Oui on peut comparer des variables texte, entoure ces variable de guillemets.
espace autour de != (mais pourquoi teste l'inégalité ???l'égalité c pareil !)
tu recupere l'extension dans une variable, tu compare l'extension comme j'ai ecrit plus haut
#5 Le 27/11/2008, à 18:46
- AnsuzPeorth
Re : Programme tous simple Shell
La 'bible' du bash
http://abs.traduc.org/abs-5.3-fr/
#6 Le 27/11/2008, à 18:48
- Mr.Photoshop
Re : Programme tous simple Shell
J'ai bien mis les guillemets , rajouté test devant (même si c'est pas utile).
Je teste l'inégalité car j'utilise basename qui enlève l'extension
Donc la ça me donne
fichier=$1
testc=`basename $fichier .c`
testcc=`basename $fichier .cc`if [ test "$testc"!="$fichier" ]
then gcc $fichier -o $testcelif [ test "$testcc"!="$fichier" ]
then g++ $fichier -o $testccelif [ test -f $fichier ]
then echo "ce type de fichier n'est pas pris en charge"else echo "le fichier n'existe pas"
fi
Si je rajoute des espaces , il y a trop d'arguments pour test
Et effectivement ta solution est bonne , mais plutôt que d'aller vers une autre solution , j'essaie de comprendre pourquoi celle-là ne marche pas .
Merci encore pour ton aide .
EDIT : Bon si je mets des espaces entre le != et que j'enleve test , ca marche , sauf le test -f $fichier , qui ne veut pas marcher : opérateur binaire attendu ..
EDIT_2 : Les crochets à la fin étaient de trop , ils remplacent test en fait ... comme quoi on apprend des choses.
Merci pour ton aide
Dernière modification par Mr.Photoshop (Le 27/11/2008, à 18:54)
Hors ligne
#7 Le 27/11/2008, à 18:58
- AnsuzPeorth
Re : Programme tous simple Shell
Dans ton premier exemple tu n'utilisais pas la commande test!
Chez moi, basename ne supprime l'extensiion !
Je trouve que tu cherche midi à quatorze heure qd meme (d'habitude c'est moi....j'ai trouvé encore plus tordu )
Si tu veux que je te donne ma solution ?
(je vais essayer de faire tourner ton script, c pas promis non plus !)
#8 Le 27/11/2008, à 19:01
- AnsuzPeorth
Re : Programme tous simple Shell
Pour teste si une variable est vide, c'est -n
if [ -n "$var" ]
http://abs.traduc.org/abs-5.3-fr/ch07.html
#9 Le 27/11/2008, à 19:03
- AnsuzPeorth
Re : Programme tous simple Shell
voilà comment j'ai fait (vu que tu as réussi avec ton script)
#!/bin/bash
nom=`basename $1 | cut -d "." -f2`
if [ "$nom" = "c" ]; then
echo "gcc $1"
elif [ "$nom" = "cc" ]; then
echo "g++ $1"
else
echo "aucun fichier en argument ou fichier non pris en charge"
fi
exit
#10 Le 27/11/2008, à 19:15
- AnsuzPeorth
Re : Programme tous simple Shell
Avec les controle du fichier en argument:
#!/bin/bash
extension=`basename $1 | cut -d "." -f2`
if [ "$extension" = "c" ]; then
echo "gcc $1"
elif [ "$extension" = "cc" ]; then
echo "g++ $1"
elif [ ! -n "$extension" ]; then
echo "aucun fichier en argument"
else
echo "fichier non pris en charge"
fi
exit
#11 Le 27/11/2008, à 20:34
- Totor
Re : Programme tous simple Shell
bonsoir,
il est possible de comparer une chaine de caractères avec une expression régulière via l'emploi de l'opérateur =~. Cela évite d'extraire l'extension.
#!/bin/bash
fichier = "$1"
[[ ! "${fichier}" =~ \.cc$ && ! "${fichier}" =~ \.c$ ]] && { echo "Fichier non pris en charge"; exit 1; }
[[ "${fichier}" =~ \.c$ ]] && gcc "${fichier}" -o "${fichier%.c}"
[[ "${fichier}" =~ \.cc$ ]] && g++ "${fichier}" -o "${fichier%.cc}"
-- Lucid Lynx --
Hors ligne
#12 Le 27/11/2008, à 22:45
- Mr.Photoshop
Re : Programme tous simple Shell
Ca à l'air bien comme code , mais je n'ai absolument rien compris Totor
Je repasserai le relire quand j'aurai avancé dans mes cours
Et merci pour ton exemple AnsuzPeorth
Voici mon code au final :
fichier=$1
testc=`basename $fichier .c`
testcc=`basename $fichier .cc`
if [ "$testc" != "$fichier" ]
then gcc $fichier -o $testc
elif [ "$testcc" != "$fichier" ]
then g++ $fichier -o $testcc
elif test -f "$fichier"
then echo "ce type de fichier n'est pas pris en charge"
else echo "le fichier n'existe pas"
fi
Dernière modification par Mr.Photoshop (Le 27/11/2008, à 22:46)
Hors ligne
Pages : 1