Aide script unix

Fermé
Utilisateur anonyme - 22 mai 2010 à 11:51
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 - 22 mai 2010 à 17:34
salut à tous !

voila, je révise mes partiels et il se trouve que je ne connais vraiment pas les scripts unix ... si quelqu'un pouvait répondre à ces question ca serai super !
les voicis :

1 - Ecrire un script qui vérifie l'existance dans le répertoire courant du fichier dont le nom est passé en paramètre
2 - Ecrire un script qui vérifie que le nom passé en paramètre est un fichier ou un répertoire
3 - Ecrire un script qui qui concatène puis trie deux fichiers file1 et file2 dans un nouveau fichier file3 et affiche le nombre total de lignes. (les noms des trois fichiers doivent être passés en paramètre)
4 - Ecrire un script formé de deux fonctions. la fonction "somme" qui calcul la somme des nombres saisis au clavier et la fonction affiche qui affiche le résultat à l'écran
5 - modifier le script précédent ("4") pour demander à l'utilisateur de saisir au clavier le (ou les) noms de fichiers qu'il aurait oublié d'indiquer en lancant le script.
6 - Ecrire un script de shell qui permet de traiter un répertoire en transformant les noms des fichiers du majuscules aux minuscules
7 - modifier le script précédent ("6") pour pouvoir traiter le cas ou l'argument est un fichier
8 - corriger le script précédent ("7") pour tenir compte des fichiers qui peuvent porter le même nom ou l'utilisateur passe plus d'un argument
9 - Améliorer le script précédent en lui ajoutant une option -m pour les minuscules et -M pour les majuscules



voila, merci d'avance aux personnes qui connaitraient les réponses (et m'aideraient réellement pour mon partiel !

bne journée à tous
A voir également:

4 réponses

mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 7 834
22 mai 2010 à 12:03
Vu ton nombre de message postés, je pense que tu sais très bien qu'a priori CCM ne sous-traite pas les exercices des étudiants.

De toutes façons le fait de te donner les réponses ne t'aidera pas à réviser puisqu'on te posera en partiel d'autres questions. Il serait à mon avis plus sage de lire un tutoriel sur le shell et de retenir la syntaxe.

http://www.laboiteaprog.com/article-70-3-bash_introduction
http://doc.ubuntu-fr.org/tutoriel/script_shell

Bonne chance
1
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 7 834
22 mai 2010 à 12:35
Oui pas de soucis. Effectivement ça se fait assez vite mais à mon avis il faut un peu plus de 10min.

Et surtout le fait de le faire par toi-même sera plus intéressant intellectuellement parlant et t'évitera de bloquer le jour du partiel (tu verras que le shell est un langage pour lequel il y a plein de petits pièges, la seule manière d'en avoir conscience est de les avoir vécus.)

Pour la question 6, tu peux récupérer les noms de répertoires avec la commande find et les bons arguments. Avec la commande tr, tu peux changer la casse.

Étant donné que tu débutes en shell et que tu ne peux pas connaître toutes les fonctions qui existent (ceci dit n'oublie pas que ça se retrouve avec le man, celui-ci suggère souvent des commandes shells connexes entre elles), je vais te dire ce dont tu as besoin pour chaque question :

1 - Ecrire un script qui vérifie l'existence dans le répertoire courant du fichier dont le nom est passé en paramètre

Pour récupérer un paramètre dans un script shell les variables importantes sont :
$0, $1, $2, ....
$#
$@

Je te laisse regarder avec un echo ce qu'elles contiennent. Ensuite il suffit d'utiliser un if avec le bon test. En bash il y a plein de tests sur les chaînes, les valeurs numériques, les fichiers etc...

2 - Ecrire un script qui vérifie que le nom passé en paramètre est un fichier ou un répertoire

Idem

3 - Ecrire un script qui qui concatène puis trie deux fichiers file1 et file2 dans un nouveau fichier file3 et affiche le nombre total de lignes. (les noms des trois fichiers doivent être passés en paramètre)

Tu auras besoin de cat et de wc en plus des notions vues dans 1 et 2.

4 - Ecrire un script formé de deux fonctions. la fonction "somme" qui calcule la somme des nombres saisis au clavier et la fonction affiche qui affiche le résultat à l'écran

En utilisant read et ceci ça devrait rouler :
http://www.trustonme.net

5 - modifier le script précédent ("4") pour demander à l'utilisateur de saisir au clavier le (ou les) noms de fichiers qu'il aurait oublié d'indiquer en lancant le script.

Le 4 ?

6 - Ecrire un script de shell qui permet de traiter un répertoire en transformant les noms des fichiers du majuscules aux minuscules

Tu auras besoin de tr et de find.


7 - modifier le script précédent ("6") pour pouvoir traiter le cas ou l'argument est un fichier


https://forums.commentcamarche.net/forum/affich-37620017-comment-lire-un-fichier-ligne-par-ligne


8 - corriger le script précédent ("7") pour tenir compte des fichiers qui peuvent porter le même nom ou l'utilisateur passe plus d'un argument


Bon là je ne vois pas trop comment faire ça dans l'élégance. Ce que je te propose : tu itères sur $@ pour générer une chaîne (appelons la args) ou chaque argument de $@ est séparé par un \n (retour à la ligne). Ensuite avec un "echo args | uniq" tu peux virer les doublons.

Attention aux chemins avec des noms de fichiers comportant des espace il faut être TRÈS prudent. Tu auras sans doute besoin de la commande eval.

9 - Améliorer le script précédent en lui ajoutant une option -m pour les minuscules et -M pour les majuscules

Un simple if pour paramétrer l'appel de tr et c'est dans la poche. Concrètement cela consiste à générer la commande tr à appeler dans une chaîne de caractère. Une fois la chaîne générée, on l'évalue en tant que commande shell grâce à eval.

Dans tes révisions, essaye de bien comprendre comment faire des pipes (pardon) c'est sans doute l'une des notions les plus importantes. Il faut pour cela avoir bien compris ce qu'était une redirection au préalable (opérateurs <, 1>, 1>>, 2>, 2>>), car au final, un pipe n'est qu'une redirection de ce qui aurait du être écrit dans /dev/stdout vers un processus (qui au lieu de lire /dev/stdin lit ce flux teste redirigé).

Bonne chance pour tes révisions ;-)
1
Utilisateur anonyme
22 mai 2010 à 12:11
ou je le sais, mais ce n'est pas un devoir maison ^^ (et je me suis dit qu'un mec callé en script unix en aurait pour 10 min max =D )

je regarde tes liens, ca a l'air bien expliqué, mais si quelqu'un pouvait juste me donner la réponse du 6 ( j'ai vraiment du mal a comprendre les shell) ca serai cool.

je regarde tes tuto, j'essaye de faire l'exo, et je poste mes réponses. Pourras tu regarder et corriger si besoins?

merci
0
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 7 834
Modifié par mamiemando le 22/05/2010 à 12:59
Il faut itérer sur le résultat de find avec une boucle for.
0
voila donc les shell que j'ai fais :
6 -  
Trouver TousFichier() 
{ 
   $NomFichier 
   $NouveauNom 
   for $NomFichier in $1 ; do  #$1 est le répertoire 
       $NouveauNom ='echo $ NomFichier | tr 'A-Z' 'a-z'' 
       mv $NomFichier $NouveauNom 
   done 
} 

7  -  
Trouver TousFichier() 
{ 
   $NomFichier 
   $NouveauNom 
   if [ ! -f $1 ] ; then  
   { 
      echo « vous avez passé un fichier et non un répertoire en paramètre » 
   } 
   Else  
   { 
      for $NomFichier in $1 ; do  #$1 est le répertoire 
             $NouveauNom ='echo $ NomFichier | tr 'A-Z' 'a-z'' 
             mv $NomFichier $NouveauNom 
      done 
   } 
   fi 
} 
8 -  

9 -  
Trouver TousFichier() #$1  nomrépertoire, $2 : -m ou -M 
{ 
   $NomFichier 
   $NouveauNom 
   if [ ! -f $1 ] ; then  
   { 
      echo « vous avez passé un fichier et non un répertoire en paramètre » 
   } 
   Else  
   { 
       If[$2 == 'm'] ; then 
      { 
         for $NomFichier in $1 ; do  #$1 est le répertoire 
                 $NouveauNom ='echo $ NomFichier | tr 'A-Z' 'a-z'' 
                 mv $NomFichier $NouveauNom 
         done 
      } 
      Else if[$2 = 'M'] ; then  
         { 
            for $NomFichier in $1 ; do  #$1 est le répertoire 
                $NouveauNom ='echo $ NomFichier | tr 'a-z' 'A-Z'' 
               mv $NomFichier $NouveauNom 
           done 
         } 
         Else{ 
              Echo 'option non reconnue' 
         } 
         Fi 
     fi 
   } 
   fi 
} 




je ne vois donc pas ce que je dois faire pour la 5 et la 8. le reste est-il bon?

merci beaucoup !
0
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 7 834
22 mai 2010 à 13:20
Bah déjà les accolades en shell et les mots clé (Else, Fi...) pas en minuscule ça me choque un peu. Je pense que la moindre des choses c'est de tester tes scripts. Si tu es sous windows tu peux installer putty pour te connecter sur un linux ou bien cygwin pour installer un environnement shell sous windows.

Merci de ne donner sur le forum que des scripts qui fonctionnent.
0
Utilisateur anonyme
22 mai 2010 à 13:30
et bien sur le lien que tu m'avais donné, ils utilisent des accolades ... Et pour corriger un script il faut bien que je te le transmette non ? (quand j'ai en dev, les gens postent leur code et je le corrige)

je vais essayer cygwin
0
mamiemando Messages postés 33591 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 mars 2025 7 834
Modifié par mamiemando le 22/05/2010 à 17:36
Ah tiens oui sur doc ubuntu ils ont un peu craqué. Ben général... on n'en met pas, sauf pour les fonctions :-) Ceci dit ça doit sans doute quand même marcher avec les accolades, il faudrait tester.

Pour la correction oui il me le faut, mais seulement quand tu es bloqué (c'est-à-dire quand tu as testé et que tu ne t'en sors pas :p).
0