Bash - 使用参数作为循环参数

时间:2015-05-26 03:07:49

标签: bash loops

我尝试使用bash将多个目录中的多个图像拼接成一个视频。以下脚本有效。

for f in {0..289}; do convert +append Viewer/$f.png Timeline_Board/$f.png Leaderboard/$f.png Montage/montage$f.png; done
cd Montage
ffmpeg -f image2 -r 7 -i montage%d.png -vcodec libx264 -crf 22 montage.mkv

这会循环通过0.png到289.png的帧并按预期将组件缝合在一起。但是,我并不总是知道我将转换多少帧。我希望能够做的就是使用这样的一行:

for f in {0..$1}; do convert +append Viewer/$f.png Timeline_Board/$f.png Leaderboard/$f.png Montage/montage$f.png; done

我可以传入一个命令行参数来精确选择我想要的帧数。但是,当我在我的脚本中运行该行并运行./convert_images 289时,出现错误convert: unable to open image 'Viewer/{0..289}.png': No such file or directory @ error/blob.c/OpenBlob/2675.

好像bash没有将我传入的整数解释为循环的参数。如何使bash将变量视为一个数字来循环到?

1 个答案:

答案 0 :(得分:0)

如果你的shell是bash,请使用C风格的for循环:

for ((f=0; f<289; f++)); do
  ...
done

要解释为什么 - 在参数扩展之前,支撑扩展发生了,因此当变量发生时,它的值仍然不可用。