[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux-team] Iteration d'une commande
> Ce qui est fastidieux.
> J'aimerais mieux qqch du style:
> iterate --range 0-10 "mpg123 -b 10000 -s fichier_#1.mp3 | sox -t raw -r 44100 -s -w -c2 - audio_#1.wav"
> OU
> iterate "mpg123 -b 10000 -s fichier_*.mp3 | sox -t raw -r 44100 -s -w -c2 - audio_#1.wav" ou le #1
> serait remplace par l'occurence courante du *.
> Un peu comme la commande 'mmv' qui fait des deplacements multiples de fichiers.
> Qqn a une idee ?
Plutôt la 1ère solution (plus élégant ;))
Disons:
iterate 0 10 (mpg123 -b 10000 -s fichier_@.mp3 | sox -t raw -r 44100 -s -w -c2 - audio_@.wav)
Remarque bien les ( ) pour ouvrir un subshell, sinon c'est le résultat du iterate qui sera passé au |
Bon, reste le iterate: sous bash, faisons-en une fonction:
function iterate
{
counter=$1; shift
end=$1; shift
# les shifts sont nécessaires pour récupérer tout le reste de la ligne de commande dans $*
while [ $counter -lt $end ]
do
eval ${*//@/$counter}
counter=$(( $counter + 1 ))
done
}
Evidemment, un petit test préalable
[ $end -ge $counter ] || { echo 'ho la, iterate <debut> <fin> avec <debut> <= <fin>, siouplé'; exit 1 }
serait pas mal ;)
Remarquez le
counter=$(( $counter + 1))
qui est *beaucoup* plus rapide que
counter=`expr $counter + 1`
parce que $(( )) est un builtin de bash et ksh pour les opération mathématiques;
il y a aussi:
let counter=$counter+1
qui est un builtin de bash aussi.
Autre astuce propre à bash:
${*//@/$counter}
remplace chaque @ dans $* (càd tous les arguments => c'est pour ça qu'il faut faire les 2 shifts après
avoir récupéré les arguments de iterate) par la valeur de counter.
Ca évite un sed bien gras:
eval `echo $* | sed "s/@/$counter/g"`
et c'est un builtin aussi ;)
-o) Pascal Bleser | UNIX *is* user friendly.
/\\ C++/UNIX Development | It's just selective about
_\_v ATOS Payment Systems | who its friends are...
pbleser@atos-group.com---------------------------------
---------
This message was sent by Majordomo 1.94.3. Please report problems to
manu@rtfm.be. If you want to be deleted from the list, send a mail to
majordomo@rtfm.be with "unsubscribe linux-team" in the body.