pour la boucle dans la fonction bash

J'ai récemment écrit la fonction bash suivante:

 makeaudiobook () { count=1 almbumartist=$2 for f in $1; do preprocess $f > $f-preprocessed text2wave $f-preprocessed -o $f.wav lame -b 16 --tt $f --ta $albumartist --tl $albumartist --tn $count $f.wav $f.mp3 rm -rf $f.wav $f-preprocessed count=$(($count+1)) done } 

Cela ne fonctionne pas comme prévu. Il ne parcourt pas tous les files qui correspondent à l'expression glob que je spécifie dans $1 . En tant que doubleur, cela fonctionnerait. En fait, je l'ai fait dans une fonction parce que j'étais fatigué de l'écrire comme un doublure. Mais comme une fonction bash , cela ne fonctionne pas. Alors, que dois-je faire pour le faire fonctionner?

Je veux pouvoir l'appeler sur des choses comme la sortie de split , comme,

 me@localhost$~ makeaudiobook x?? haskell 

… où x?? correspond à xaa, xab, xac, etc. Comme je l'ai dit, en tant que doubleur c'est bien. Alors, que dois-je faire pour passer cette expression glob à $1 ?

x?? est développé au moment de l'appel de la fonction. Donc votre fonction est déjà appelée avec xaa xab xac ….

Le moyen le plus simple serait de changer l'ordre de vos parameters:

 makeaudiobook () { count=1 almbumartist=$1 shift for f in "$@"; do preprocess "$f" > "$f"-preprocessed text2wave "$f"-preprocessed -o "$f".wav lame -b 16 --tt "$f" --ta "$albumartist" --tl "$albumartist" --tn "$count" "$f".wav "$f".mp3 rm -rf "$f".wav "$f"-preprocessed count=$(($count+1)) done } 

(regardez comment je mets " autour de chaque variable – ceci pour éviter que de mauvaises choses se produisent si vous avez des espaces dans vos noms de files, ce qui arrive souvent avec les files audio)

et l'appeler avec makeaudiobook haskell x?? , c'est-à-dire avec des arguments tournés.