Traiter des listes correctement en Bash

Tags:: bash :: linux :: développement

Bien souvent j'utilise des fonctions de boucle en Bash pour traiter des fichiers ou faire des tests. Vous pouvez utiliser une liste que vous donnez manuellement, une liste de fichier ou carrément utiliser une commande qui génère la liste.

Restons dans la simplicité, voici un ou deux exemples:


# for i in "foo bar baz"
do
   echo $i
done
> affiche:
# foo
# bar
# baz

#for i in `find ./ -name "*.php"`
do
   cp $i ~/sauvegarde_php
   sed -i "s/\r//g" $i   
done
> copie chaque fichier php dans un répertoire de sauvegarde
> puis remplace "\r" dans chaque fichier trouvé

#for i in `cat monfichier.txt`
do
    grep $i autrefichier.txt || echo "$i not found !"
done
> à chaque ligne trouvé dans monfichier.txt
> je vérifie si elle existe aussi dans autrefichier.txt
> sinon j'affiche le souci
 

Là où on peut avoir un souci, c'est justement dans le dernier exemple. Imaginons que monfichier.txt contienne:


foo
bar
baz
 

et le script:


#for i in `cat monfichier.txt`
do
   echo $i
done
 

Dans ce cas, on retrouve bien une ligne pour chaque élément.

Mais un problème intervient dans ce cas:


une ligne à chercher
une autre ligne
la dernière ligne
 

Le résultat va être:


une
ligne
à
chercher
une
autre
ligne
la
dernière
ligne
 

Stupeur... tremblements... ce n'est pas une erreur mais le fonctionnement normal du principe de liste en Bash. En effet, la séparation des éléments se fait via des retours chariots ou des espaces...

Voici comment vous pouvez vous en sortir: utiliser la commande "read" qui attend bien un retour chariot (ou n) pour passer à la suite:


cat monfichier.txt | while read i
do
    echo $i
done
 

Et on retrouve notre liste sans coupure à chaque espace mais bien pour chaque ligne.

Efficace non ?

Utilisez le code barre pour ouvrir le ticket dans votre mobile:
This ticket on you mobile
1 Mercredi 08 Avril 2009 21:23:40, Xate

Argh ! Un pipe ! Quel horreur.
Je propose plutôt :

while read ligne;
do
echo $ligne
done < monfichier.txt

C'est plus joli, non ?

Sinon, on peut aussi jouer en modifiant IFS, mais c'est moins portable...

Ajouter un commentaire
Veuillez répondre à la question suivante : Tapez en minuscule le nom de l'animal qui fait wouaf wouaf

Trackbacks

Pour ajouter un trackback (retrolien) sur ce ticket, utilisez cette adresse: http://www.metal3d.org/index.php/trackback/default/tb?id=blog%2F184

Tags

Blog Copix Communication PC Config Fedora Vidéo Humour Autre Web Materiel Informatique PHP Développement Mootools HTML Linux WEB IE CSS Vista Microsoft Sympa XHTML Quizz Widget Klik CWE Voeux Bonne année Musique CCRMA Son Audio MAO Reconnaissance vocale Windows Mac Compiz MacOS Mysql Sun Base de données BD Screenlets Screenlet RPM compiz Ubuntu Live FireFox Derambarsh Facebook media informations Sécurité javascript SSH Commande Marketing concours ipod wii QT Trooltech Nokia Libre Logiciels GPL Attali Gnome Dock Compiler Bench undelete reiserfs recovery recover Thread Serveur Optimisation Server Apache Album RSS Flash Air XML Firefox Blender Opensource Orange Internet LiveBox Animaux Droits Logiciels Libres Google Loi RBS netcat Bash Téléphone Spam 3D NIDIA Standards Widgets Merise UML Streaming Developpement Perl MySQL Firewall Parfeu Bayes Novell Réseau Python LVS Salon FTP Dedibox Chrome Administration IRC Gentoo troll video Nouveauté Finance Etudiant spéctacle OpenOffice Javascript Java Info Eclpise ATI design mootools KDE Bureau Design GNU C Pages Jaunes Fun Bijoux Art mail Admin vmware fedora linux VirtualBox VMWare Qemu KVM vim Grep Fglrx Webkit GTK google web JQuery Coup de gueule coup de gueule Lois SVG Raycaster Canvas Hadopi Desktop Jeux Les Sims développement astuces Screen firefox Mobile Safaru Wine bash commande astuce Wave ooc C++ C# Netbook Hercules Bureautique Twitter Safari W3C chrome kazehakaze midori navigateur gecko webkit Links Liens Pyhon Nouvelles Metal Perso Conférence JDLL PCC Roadsend OOC News Acteur Cinéma Chanteur Seven windows orthographe pcc php jdll Slide Application mysql Html twitter python screen curses SVN Android Gphone iPhone OpenGL MindMap Projet Javascrtip Ajax Guitare Tab Tablature JSON firebug Chromium Iphone Titanium music sound android ogg ogv streaming

  • twitter entries...
follow me on Twitter

Valid XHTML 1.0 Strict