Votre question

[ Résolu ] Aide Shell

Tags :
  • Script
  • Programmation
Dernière réponse : dans Programmation
3 Octobre 2007 21:49:44

Alors voila j'ai des exercices a faire sur la programmation en shell. Mais notre prof est super bidon, donc je n'ai rien compris et je ne suis pas le seul :sarcastic: 

Voici les énoncés :

5. Ecrire un script shell qui permet de créer le répertoire rep07-08 sous le répertoire passé en paramètre, et affiche le message "Création refusée" si la création a échoué, ou le message "création réussie" dans le cas contraire.
Tester avec les répertoires suivants :

le répertoire courant
le répertoire /dev
votre home (répertoire de login)

6. Ecrire un script shell qui teste qu'il y a exactement deux paramètres et que le premier paramètre est un répertoire accesible en écriture. Le second paramètre est le nom d'un fichier ordinaire. Si le fichier existe dans ce répertoire, conserver celui qui a la plus grande taille en octets. Si le fichier n'exite pas il faut le copier.


Alors si vous pourriez m"aidez, me donner les bases des commandes. M'expliquez le truc des $1, $2... du echo et tout parce que je nage :D 

Merci

Autres pages sur : resolu aide shell

3 Octobre 2007 22:24:18

NaSr1 a dit :
Mais notre prof est super bidon, donc je n'ai rien compris et je ne suis pas le seul :sarcastic: 

on a tous du dire ca un jour, meme si c'était 99% par manque d'attention :) 
NaSr1 a dit :

Alors si vous pourriez m"aidez, me donner les bases des commandes. M'expliquez le truc des $1, $2... du echo et tout parce que je nage :D 


tu peux commencer par là:
http://www.trustonme.net/didactels/148.html
4 Octobre 2007 10:28:30

oui, tu peux commencer par cherche par toi meme.
si tu te lances dans l'info, y'aura rarement quelqu'un derrière toi pour t'expliquer les choses.
Contenus similaires
4 Octobre 2007 12:00:44

Vinz42 a dit :

si tu te lances dans l'info, y'aura rarement quelqu'un derrière toi pour t'expliquer les choses.



Si ... toujours la même personne pour moi: mon patron.. En m'expliquant qu'il me l'a demandée il y a DEJA 10 minutes, que ca prend pas plus de 5 minutes selon lui, et qu'il commence a trouver le temps long donc que je dois me grouiller 1 peu ... ;) 
4 Octobre 2007 12:13:40

elendilm a dit :
Si ... toujours la même personne pour moi: mon patron.. En m'expliquant qu'il me l'a demandée il y a DEJA 10 minutes, que ca prend pas plus de 5 minutes selon lui, et qu'il commence a trouver le temps long donc que je dois me grouiller 1 peu ... ;) 

nan, ton patron, il est pas là pour t'expliquer comment ça marche, il est là pour te faire magner le cul sur des choses que tu es censé connaitre.

déforme pas ce que je dis, merci.
4 Octobre 2007 14:31:14

Merci pour le lien ;) 

Voila j'ai fait le 5, mais il me dit error syntax ligne 15

#!/bin/bash
if [ $# -ne 1 ]
then
echo " Veuillez entrer un nom de repertoire."
exit 1
fi
cd .
mkdir $1
cd $1
mkdir rep07-08
if [ $? = 0 ]
then
echo "Création réussie"
else
echo "Création refusée"
fi

Je cherche pour le 6
4 Octobre 2007 19:26:14

Vinz42 a dit :
nan, ton patron, il est pas là pour t'expliquer comment ça marche, il est là pour te faire magner le cul sur des choses que tu es censé connaitre.

déforme pas ce que je dis, merci.




Rooooo .. le tendu du calecon !!!

Arrives tu à detecter la boutade ?

Citation :
des choses que tu es censé connaitre
: la où c'est tendu, c'est quand tu bosse sur un progiciel AS400 que tu ne connais pas, dans un systeme que tu ne maitrise pas, comprenant une 100aine de bibliotheque et environ 5000 tables ... :)  :) 

Allez ... Zen !


Donc, pour répondre à la question:
cd . ca sert à rien ca, t'est déjà la ou tu le demande :) 

Tu ne teste pas par contre que le repertoire est accessible en écriture. D'ailleurs: en écriture pour qui ?? pour owner , group ou others ?

Pour tester ça, je verrai bien 1 petit
a=`ls -d -all "nom_rep" | cut -c3-3`
if [ "$a" = "w" ]
then
t'as les droits.
else
t'as pas les droits.
fi


Pour la taille des fichiers:
taill1=`du -b fichier1 | cut -c1-8`
taill2=`du -b fichier2 | cut -c1-8`

if [ taill1 -gt taill2 ]
[...]

Heuuu et si ils font la même taille ??? :) 
5 Octobre 2007 11:28:37

@NaSr1: ton programme ne contient pas d'erreur
par contre, tu ne serais pas en train de le tester sous windows?
5 Octobre 2007 11:41:50

@coca25 : ba si, parce que en cours on est sous linux mais chez moi je suis sur windows . Et en faite je me connecte a mon serveur IUT depuis chez moi. Donc en faite j'ecris mon programme sous TexPad chez moi, je l'envoye sur le serveur avec WinSCP , je le connecte avec putty , une page Xterm apparait et là j'exécute mais fichiers.

@elendilm : pourquoi me met tu une commande pour la taille des fichiers ?! L'exo ne le demande pas ...

Bon sinon l'exo 6 si vous auriez des petits indices pour m'aidez parce qu'il est bien chaud...pour mon niveau ^^

5 Octobre 2007 12:46:09

bon alors, une fois connecté à la machine linux, execute un:
dos2unix nom_du_script

et ca devrait marcher.
l'erreur provient d'un problème de retour de ligne, le shell pense que c'est une seule ligne!

pour ce qui est du 6:
pour les permissions, tu devrais voir du coté de la commande "test" et ca tombe bien, son utilisation est expliqué dans le lien que je t'ai passé (recherche test dans la page)
pour la taille d'un fichier, tu peux utiliser la commande:
stat -c %s nom_du_fichier


pour récupérer la sortie d'une commande dans une variable:
taille1=$(stat -c %s nom_du_fichier)

tu auras la taille dans $taille1
5 Octobre 2007 18:12:18

NaSr1 a dit :

@elendilm : pourquoi me met tu une commande pour la taille des fichiers ?! L'exo ne le demande pas ...



Je sais pas moi , peut être pour ça:
Citation :
Si le fichier existe dans ce répertoire, conserver celui qui a la plus grande taille en octets
6 Octobre 2007 12:28:08

@coca25 : merci pour les aides du 6, je vais voir çà cette après-midi . Mais quel problème ? J'arrive très bien a éxécuter mes programmes de chez moi et j'ai vérifié hier il marche bien sous linux .

@elendilm : ah désolé, j'avais pas lu l'exo 6 encore ^^ . J'étais à fond dans le 5...donc là je comprend mieux, donc merci :D 
6 Octobre 2007 14:18:28

NaSr1 a dit :
Mais quel problème ? J'arrive très bien a éxécuter mes programmes de chez moi et j'ai vérifié hier il marche bien sous linux .


faudrait savoir quand même !

NaSr1 a dit :

Voila j'ai fait le 5, mais il me dit error syntax ligne 15



6 Octobre 2007 14:34:21

ah oui désolé, j'ai tellement édité ce post que certains bout de phrases ont été oublié . Donc le 5 c'est bon, il marche très bien .
Désolé encore .

Je commence le 6, je vais le faire avec vos commandes, je vous mettrait mon programme, juste après
6 Octobre 2007 14:44:16

éditer n'est pas forcément une bonne idée à chaque fois, ca empêche de comprendre si on fait pas partie de la discussion!
6 Octobre 2007 15:22:28

ok.
Euh une question comment fait ton pour mettre plusieurs informations dans un if ? Comme çà c'est bon ?? :

if [ $1 -d && $1 -w ]

Et une deuxieme , pour le contraire faut mettre quoi et comment et ou, enfin tout en faite ^^
6 Octobre 2007 15:54:34

plusieurs conditions:
  1. if [[ -d $1 && -w $1 ]]; then
  2. echo vrai
  3. else
  4. echo faux
  5. fi

contraire:
  1. if [ ! -d $1 ]; then
  2. echo vrai
  3. else
  4. echo faux
  5. fi
6 Octobre 2007 16:07:28

D'accord je te remercie .
6 Octobre 2007 16:43:42

euh une question, comment faire pour :
-crée le fichier, ici $2

-copier un fichier dans un répertoire, ici copier $2 dans $1. est ce : cp $2 $1

-comparer la taille d'un fichier avec un autre, nous ne connaissons pas les 2 noms. Ici comparer $2 et le meme nom . J'ai mis $3 mais ca me semble faux.

Voici mon prog, qui ne marche pas ^^ :
#! /bin/bash
if [ $# -ne 2 ]
then
echo " Veuillez entrer le nom du repertoire et ensuite le nom du fichier."
exit 2
fi

if [[ -d $1 && -w $1 ]]
then
echo "Le répertoire existe et est en ecriture"



if [ -a $2 ]
then

if [ $2 < $3 ]
then
rm "$3"

else
rm "$3"
fi
else
echo "Votre fichier n'existe pas"
cp $2>/systeme/tp3/$1
echo "Votre fichier a été placer dans $1"
fi

else
echo "Soit vous n'avez pas le droit soit votre répertoire saisi n'existe pas"
fi
6 Octobre 2007 17:06:39

NaSr1 a dit :
euh une question, comment faire pour :
-crée le fichier, ici $2

t'as pas à le créer, il est censé exister vu que tu dois comparer sa taille à un autre!

NaSr1 a dit :

-copier un fichier dans un répertoire, ici copier $2 dans $1. est ce : cp $2 $1

si tu cherchais un peu, non?
http://www.trustonme.net/didactels/130.html
ou sinon
man cp

NaSr1 a dit :

-comparer la taille d'un fichier avec un autre, nous ne connaissons pas les 2 noms. Ici comparer $2 et le meme nom . J'ai mis $3 mais ca me semble faux.

relis l'énoncé, on te donne un fichier et un repertoire, et il te faut vérifier si le fichier existe déjà dans le répertoire! donc c'est le même nom, mais pas le même emplacement.
ex:
/tmp/fichier1
/tmp/rep/fichier1
NaSr1 a dit :

if [ $2 < $3 ]
then
rm "$3"

else
rm "$3"
fi

ca sert à quoi ca?
"<" n'est pas pour "inférieur", il faut utiliser "-lt"
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/...
tu ne prends nulle part la taille des fichiers.

NaSr1 a dit :

cp $2>/systeme/tp3/$1

voir plus haut
6 Octobre 2007 17:14:08

merci, et je cherche depuis 14h :D 

Mais je n'ai fait que 5h de systeme dans ma vie, donc je ne connait presque rien et je ne sais rien utilisé. Mon prof explique pas . Genre -lt je connaissais pas . Merci quand meme
7 Octobre 2007 14:47:12

Voila j'ai fait çà mais ca ne marche pas . Ensuite l'énoncé est vraiment très mal écrit, et manque de précisions !

#! /bin/bash
if [ $# -ne 2 ]
then
echo " Veuillez entrer le nom du repertoire et ensuite le nom du fichier."
exit 2
fi

if [[ -d $1 && -w $1 ]]
then
echo "Le répertoire existe et est en ecriture"



if [[ -a $2 && -f $2 ]]
then
echo "Votre fichier existe déja dans ce repertoire"
echo "Comparaison en cours..."

if [ $2 -lt $3 ]
then
rm "$2"

else
rm "$3"
fi
else
echo "Votre fichier n'existe pas dans ce répertoire"
cp $2/chemin/vers/$1
echo "Votre fichier a été placer dans $1"
fi

else
echo "Soit vous n'avez pas le droit soit votre répertoire saisi n'existe pas"
fi


EDIT : j'ai copier/coller
7 Octobre 2007 15:52:06

copie coller, c'est bcp mieux.
revois la notion de variable:
$1, $2 etc... sont les arguments de la ligne de commande. t'en a 3??
si tu considères que $2 est le nom de fichier, en reflechissant logiquement, tu penses que ca peut faire quoi [ $2 -lt $3 ] ?

cp $2/chemin/vers/$1
tu penses vraiment que c'est une commande valide ca?

if .. then .. else => si .. faire .. sinon
alors je vois pas l'interet de mettre exactement la meme instruction dans le "if" et le "else"!

as tu déjà programmé avec un autre langage?
7 Octobre 2007 16:08:31

ba en ce moment je programme en java, et un peu C et un peu d'assembleur . Mais comme tu peux voir je suis qu'en début de mon IU info. Ca fait que 3 semaines que je suis en cours.

Pour les variables je suis, je comprend tout a fait la ocnnerie que j'ai ecris (le $3) mais je vois trop pas quoi mettre, vu que c'est le meme fichier mais peut etre pas la meme taille .

Pour le -lt, ba j'ai regardé le site que tu m'a passé, mais bon après j'ai pas trouvé d'exemples pour l'appliquer .

PS: je trouve ce langage vraiment merdique, car il faut faire plein de truc pour rien, tout comme l'assembleur.
7 Octobre 2007 16:45:22

et tu la récupères où, la taille?

si c'est pour rien, il faut pas les faire!
le "-a", tu l'as eu où?
7 Octobre 2007 17:38:55

le -a, ba dans mon cours, c'est pour prouver l'existence d'un fichier.

Je ne sais pas récupérer la taille d'un fichier, donc je ne l'ai pas mis. Il faut le mettre vu qu'il le demande.
7 Octobre 2007 17:50:11

ah oui, je regardais le mauvais "man" pour le -a


  1. #!/bin/bash
  2. if [ $# -ne 2 ]
  3. then
  4. echo "Usage: $0 repertoire fichier"
  5. exit 2
  6. fi
  7.  
  8. if [[ -d $1 && -w $1 && -f $2 ]]
  9. then
  10. taille1=$(stat -c %s $2)
  11. cd $1
  12. if [ -f $2 ]
  13. then
  14. taille2=$(stat -c %s $2)
  15. if [ $taille2 -lt $taille1 ]
  16. then
  17. echo ecrasement
  18. else
  19. echo conservation
  20. fi
  21. else
  22. echo copie
  23. fi
  24. else
  25. if [ -f $2 ]
  26. then
  27. echo "$1 n'est pas un répertoire ou n'est pas accessible en écriture"
  28. else
  29. echo "$2 n'est pas un fichier"
  30. fi
  31. fi
7 Octobre 2007 18:44:33

Merci, je suis d'accord avec ce que tu as mis, mais par contre tu a faire ecrire copie, ok, mais aucune action pour copier le fichier :D  (je ne sais pas le faire...)

Sinon quelques questions, quel est la différence entre :
- echo copie
et
- echo "copie"

Et peut tu m'expliquer comment fonctionne, taille=$(stat -c %s $2)
7 Octobre 2007 18:48:37

t'abuses pas un peu, non ?
man cp
man rm



pour stat, c'est une commande:
man stat

le $() sous bash, c'est pour récupérer la sortie d'une commande
7 Octobre 2007 18:59:42

Voici la correction :
  1. #!/bin/bash
  2.  
  3. if [ $# -ne 2 ]
  4. then
  5.  
  6. echo "Usage: $0 repertoire fichier"
  7. exit 2
  8.  
  9. fi
  10.  
  11. if [ -d $1 ] && [ -w $1 ] && [ -f $2 ]
  12. then
  13.  
  14. if [ -f $1/$2 ]
  15. then
  16. taille1=$(wc -c $2 | cut -d' ' -f1)
  17. taille2=$(wc -c $1/$2 | cut -d' ' -f1)
  18.  
  19. if [ $taille1 -gt $taille2 ]
  20. then
  21. cp $2 $1
  22.  
  23. fi
  24.  
  25. else
  26. cp $2 $1
  27. echo "Copie du fichier"
  28. fi
  29. fi



Je te remercie énormément de ton aide ;) 

J'ai beaucoup apris en un wek end
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS