para loop na função bash

4

Eu escrevi recentemente a seguinte função bash :

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
}

Não funciona como esperado. Ele não itera todos os arquivos que se encaixam na expressão glob que eu especifico em $1 . Como um one-liner, isso funcionaria. De fato, eu fiz isso em uma função porque eu estava cansado de escrevê-lo como um one-liner. Mas como uma função bash , não funciona. Então, o que eu preciso fazer para dar certo?

Eu quero poder chamá-lo em coisas como a saída de split , como

me@localhost$~ makeaudiobook x?? haskell

... onde x?? corresponde a xaa, xab, xac, etc. Como eu disse, como uma linha única, tudo bem. Então, o que eu preciso fazer para passar esta expressão glob para $1 ?

    
por ixtmixilix 28.02.2013 / 09:44

1 resposta

11

x?? é expandido no momento da chamada de função. Então sua função já é chamada com xaa xab xac ....

A maneira mais simples seria alterar a ordem dos seus parâmetros:

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
}

(veja como eu coloco " em torno de cada variável - isso é para evitar que coisas ruins aconteçam se você tiver espaço em branco nos nomes dos arquivos, o que geralmente acontece com os arquivos de áudio)

e chame-o com makeaudiobook haskell x?? , i. e. com argumentos rotacionados.

    
por 28.02.2013 / 09:53