Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Petit pb de shell
Envoyé par: fredp66

Bonjour, je suis en train d'essayer d'écrire un petit script pour renommer un ensemble de fichiers et mon problème est le suivant:

j'ai une lsite contenue dans un fichier noms.txt et j'aimerai faire un boucle qui parcourt ce fichier et je n'y arrive pas !!!!

En désespoir de cause, j'ai essayé de faire un copier-coller de la lsite dans mon script et j'ai définié une variable par a="liste des noms", mais soit a ne contient que le premier nom, soit il les contients tous concaténés (j'ai essayé des anti slashes des virgules des points virgules pour séparer ...rein).

Finalement je pense que je vais faire un for I in "le copier coller" ça devrait marcher mais ça ne me satisfait pas. Si quelqu'un a une idée ???

Merci

Bonne soirée

fred

Poste le Sunday 21 December 2003 22:34:39
Répondre     Citer    
Re: Petit pb de shell
Envoyé par: Svear

Apparemment, tu as essayé de faire un "for a in `cat noms.txt`"
L'idée peut sembler bonne mais il y a un gros problème: la commande "cat noms.txt" renvoie toutes les lignes d'un coup mais les backquotes qui servent à récupérer l'exécution de la commande transforment chaque fin de ligne en espace; ce qui fait que tu te retrouves avec tous les noms concaténés en une seule ligne. C'est normal; le principe de la backquote est de ne renvoyer qu'une seule ligne.

En considérant que ton fichier "noms.txt" contient un nom par ligne; tu peux essayer à la place la boucle suivante:

#!/bin/sh

cat noms.txt |while read fic
do
echo $fic
done
# Fin du script

Je t'explique le principe: Ta commande "read" va lire l'entrée standard (redirigée à partir du pipe) et tant que l'entrée n'est pas vide; la commande "read" renverra "vrai" ce qui fait que le while fonctionnera.
Une fois l'entrée standard vide; ta commande "read" renverra "faux" et le while sortira de la boucle
Par ailleurs; la commande "read" s'arrête à chaque retour charriot et chaque ligne de ton fichier "noms.txt" se termine par un retour charriot => a chaque boucle la variable "fic" contiendra une ligne différente

Attention, un très grand danger de ce genre de boucle est qu'il y a création d'un sous-process via le pipe. Ce qui veut dire que toute variable modifiée dans la boucle (un compteur de ligne par exemple) est perdue en fin du done !
Un danger encore plus grand est que si tu veux, dans ta boucle, faire saisir à l'utilisateur une réponse style "echo désirez-vous vraiment faire ceci ou cela" puis "read reponse"; ben ton read ira lire le pipe et non le clavier...

En espérant t'avoir aidé...

Poste le Sunday 21 December 2003 23:40:21
Répondre     Citer    
Re: Petit pb de shell
Envoyé par: fredp66

Merci, c'est exactement ce dont j'avais bseoin.

à bientôt

fred

Poste le Monday 22 December 2003 11:43:10
Répondre     Citer    
Re: Petit pb de shell
Envoyé par: titi

Salut,

pour eviter la creation d'un sous processus procede comme suis :

while read fic
do
echo $fic
done << noms.txt

Dans cette boucle identique a celle de Svear dans le comportement, il n'y a pas de creation de processus.

Poste le Friday 26 December 2003 23:02:34
Répondre     Citer    
Re: Petit pb de shell
Envoyé par: Svear

Oui, ce genre de boucle est en effet mieux que la précédente puisqu'il n'y a pas création de sous process (personnellement, j'y mettrais qu'un seul signe "<" au lieu des deux "<<").

En fait, l'avantage de la boucle "cat noms.txt | ..." permet de traiter n'importe quel flux; que celui-ci provienne d'un fichier "noms.txt" ou d'une commande quelconque; exemples:

who | while read user do...done
find / -name "*.c" -print |while read fic do...done
ps -edf |while read process do...done

L'inconvénient est qu'il y a création de sous-process

L'avantage de la boucle de "titi" est qu'il n'y a pas de sous process; mais on ne peut lire que le contenu d'un fichier et non le contenu d'une commande quelconque.
Chaque solution a ses avantages et ses inconvénients...

Poste le Saturday 27 December 2003 02:47:29
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Petit pb de shell
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.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons