[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.