在循环一个复杂的ffmpeg命令时,Bash参数非常糟糕。我怎样才能逃脱呢?

在循环一个复杂的ffmpeg命令时,Bash参数非常糟糕。我怎样才能逃脱呢?,bash,shell,ffmpeg,Bash,Shell,Ffmpeg,我正在尝试使用ffmpeg-filter\u complex为一组视频创建一个波形png 单行命令工作正常&为单个视频文件生成预期的波形图形: ffmpeg -i INPUT.mp4 -filter_complex:a "showwavespic=s=1080x120" -frames:v 1 OUTPUT.png 当我尝试自动处理多个文件时 for f in *.mp4 do ffmpeg -i "$f" -filter_complex:a

我正在尝试使用ffmpeg-filter\u complex为一组视频创建一个波形png

单行命令工作正常&为单个视频文件生成预期的波形图形:

ffmpeg -i INPUT.mp4 -filter_complex:a "showwavespic=s=1080x120" -frames:v 1 OUTPUT.png
当我尝试自动处理多个文件时

for f in *.mp4
do
 ffmpeg 
  -i "$f"
  -filter_complex:a "showwavespic=s=1080x120" 
  -frames:v 1 
  '"${f%.mp4}.png"'
done
ffmpeg返回一个错误:

无法为“INPUT.png”找到合适的输出格式

““INPUT.png”:参数无效

我还尝试了精简命令:

for f in *.mp4
do
 ffmpeg -i "$f" -filter_complex 'showwavespic' -frames:v 1 “${f%.mp4}.png”
done
但是得到了同样的论点错误

我猜问题是因为bash语法,我没有正确地避开引用的参数。我尝试了多个版本的命令,但没有成功。如何修复此for循环?

删除
“${f%.mp4}.png”
周围的单引号(

您的第二个命令似乎使用排印者的引号(
)而不是您想要的纯双引号(

双引号(
)告诉Bash,引号中的内容应该被视为被调用命令的一个参数,即使其中有空格。引号将不会传递给被调用的命令。BASH不认为排版员的引用是特殊的,所以它会传递给命令,而脚本不起作用,因为它们实际上不是文件名的一部分。

< P>在“代码”>“${f%.MP4}.PNG”< /C> > /P>中删除单个引号(<代码> >代码>)。 您的第二个命令似乎使用排印者的引号(
)而不是您想要的纯双引号(


双引号(
)告诉Bash,引号中的内容应该被视为被调用命令的一个参数,即使其中有空格。引号将不会传递给被调用的命令。BASH不认为排版员的引用是特殊的,所以它会传递给命令,而脚本不起作用,因为它们实际上不是文件名的一部分。

我不知道这到底是怎么发生的。我试了十几个版本,有各种各样的引用,包括你建议的版本。无论如何,这是有效的@user1891836可能是那些“有用的”文本编辑器中的一个,会干扰你的内容吗?我在一些OSX用户用TextEdit编辑他们的脚本或命令时也看到过类似的问题。这是一个很好的引用。是的。是的!尽管除了纯文本模式,我从来没有使用过其他模式,但我还是遇到了这些错误。现在我不知道这到底是怎么回事。我试了十几个版本,有各种各样的引用,包括你建议的版本。无论如何,这是有效的@user1891836可能是那些“有用的”文本编辑器中的一个,会干扰你的内容吗?我在一些OSX用户用TextEdit编辑他们的脚本或命令时也看到过类似的问题。这是一个很好的引用。是的。是的!尽管除了纯文本模式,我从来没有使用过其他模式,但我还是遇到了这些错误。现在将完全切换到升华