Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 $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

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 $testc

elif [ test "$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

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 smile

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 wink)

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 smile

Je repasserai le relire quand j'aurai avancé dans  mes cours smile

Et merci pour ton exemple AnsuzPeorth smile

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