bash 函数中的 for 循环

bash 函数中的 for 循环

我最近写了以下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
}

它没有按预期工作。它不会迭代所有符合我在 中指定的 glob 表达式的文件$1。作为一句单行话,这会起作用。事实上,我把它变成了一个函数,因为我厌倦了把它写成一句台词。但作为一个bash功能,它不起作用。那么我需要做什么才能让它发挥作用呢?

我希望能够在诸如 的输出之split类的事情上调用它,

me@localhost$~ makeaudiobook x?? haskell

...其中x??匹配 xaa、xab、xac 等。就像我说的,作为单行代码,这很好。那么我需要做什么才能将此 glob 表达式传递给$1

答案1

x??在函数调用时展开。所以你的函数已经被调用了xaa xab xac... 。

最简单的方法是更改​​参数的顺序:

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
}

(看看我如何放置"每个变量 - 这是为了防止发生不好的事情,如果你的文件名中有空格,音频文件经常发生这种情况)

并用 来调用它makeaudiobook haskell x??,即使用旋转参数。

相关内容