On Fri, Oct 01, 2004 at 12:11:53PM +0200, Daniel Cordey wrote:
> On Friday 01 October 2004 11:40, F�lix Hauri wrote:
> 
> > Ok, mais l� tu g�n�re un fork en dehors duquel tes variables n'existent
> > plus! (Ou ne sont pas mises � jour)
> 
> On s'en f... cette notion de variable n'est pas genante si tu te contente 
> d'utiliser des valeusr a l'interieure du while. Definir le contenu d'une 
> variable a l'interieur du while pour etre utilise dans le shell appelant 
> n'est pa stres courant. En 22 ans de programmation shell, ca ne m'a jamais 
> pose de probleme et on arrive toujours a s'en sortir.
> ...
> La boucle while n'est pas destinee a traiter juste une seule ligne... mais 
> l'integralite du fichier, tel que :
> 
> while read name passwd uid ...
> do
>    echo ...
> done </etc/passwd

Prenons un cas pratique: La liste des ficher mp3 dans les r�pertoires
pr�sents � mon niveau.
Partant du principe que tout les fichiers ont �t� compress� avec la m�me
commande, donc la sortie de la commande ``plaympeg'' donnera tjrs 4 lignes:
$ plaympeg --noaudio --novideo "Int�grale Vol.1/C'est l'histoire d'un mec...sur le 
pont de l'Alma.mp3" 
C'est l'histoire d'un mec...sur le pont de l'Alma.mp3: MPEG audio stream
        Audio MPEG-1 Layer 3 128kbit/s 44100Hz stereo
        Size: 7806775
        Total time: 487.923437

Que si j'essaie de ne lancer qu'une seule fois:

$ plaympeg --noaudio --novideo I*/* | grep "MPEG audio stream\|Total time"
No�l.mp3: MPEG audio stream
Total time: 145.729125
... ...
Y's foutent bien de notre gueule.mp3: MPEG audio stream
        Total time: 333.732375

Elle ne me donne pas les noms des r�pertoires, je ne peux donc ``�conomiser''
les forks qu'au niveau des s�ries de fichiers pr�sents dans 1 r�pertoire:

$ cnt=0 ;\
    tot=0 ;\
    x=${IFS} ;\
    IFS=$':\n' ;\
    for dir in I* ;do
        plaympeg --noaudio --novideo ${dir}/* |
        while read title dummy;
                read dummy ;
                read dummy ;
                read dummy dure ;do
            title=${title%.mp3}
            printf "%-28s %-42s %7.2f\n" ${dir} ${title:0:42} $dure
            tot=$(echo $tot+$dure|bc)
            cnt=$((cnt+1))
            done
        done ;\
    IFS=${x} ;\
    printf "Total: %3d fichiers, %49s %8.2f\n" ${cnt} " " ${tot}
Int�grale Bonus Les in�dits  No�l                                        145.73
Int�grale Bonus Les in�dits  Oh ! Ginette                                114.93
Int�grale Bonus Les in�dits  Reviens vas t'en                            180.29
Int�grale Vol.1              C'est l'histoire d'un mec...sur le pont de  487.92
...                          ...                                            ...
Int�grale Vol.6              PC GT - Russie-Pologne                      251.68
Int�grale Vol.6              Y's foutent bien de notre gueule            333.73
Total:   0 fichiers,                                                       0.00

�a marche pas tant bien, dommage! ;-b

$ cnt=0 ;\
    tot=0 ;\
    x=${IFS} ;\
    IFS=$':\n' ;\
    for dir in I* ;do
        set -- $(plaympeg --noaudio --novideo ${dir}/*)
        while [ "$1" ] ;do
            title=$1
            shift 6
            dure=$1
            shift
            title=${title%.mp3}
            printf "%-28s %-42s %7.2f\n" ${dir} ${title:0:42} $dure
            tot=$(echo $tot+$dure|bc)
            cnt=$((cnt+1))
            done
        done ;\
    IFS=${x} ;\
    printf "Total: %3d fichiers, %49s %8.2f\n" ${cnt} " " ${tot}
Int�grale Bonus Les in�dits  No�l                                        145.73
Int�grale Bonus Les in�dits  Oh ! Ginette                                114.93
...                          ...                                            ...
Int�grale Vol.6              Y's foutent bien de notre gueule            333.73
Total:  76 fichiers,                                                   22544.33

(Les ``read dummy'' ne sont pas forcement plus propre que le ``shift 6'';)

... et comme mes variable sont tjrs pr�sentes, je peux encore:
$ date -ud "0:0:0 UTC +${tot%.*} secs" +%T.${tot#*.}
06:15:44.330424

Ou encore arrondir les secondes avec printf:
$ printf "0:0:0 UTC +%.0f secs" $tot | date -uf - +%T
06:15:44

> Un programme shell est avant tout destine a manipuler des fichiers. Un
> programme complexe destine a faire du traitement de variables doit etre
> realise dans un langage plus adapte.
Tu as raison, mais � partir de quel moment parle-t-on de ``programme complexe''?

> Pour ce faire, il y a des langage tout aussi lisibles et nettement plus
> appropries (Tcl, php, Python, ...)
Tu as encore raison, en Perl ce genre de truc est trivial ;-)

-- 
 F�lix Hauri  -  <[EMAIL PROTECTED]>  -  http://www.f-hauri.ch
_______________________________________________
gull mailing list
[EMAIL PROTECTED]
http://lists.alphanet.ch/mailman/listinfo/gull

Répondre à