我正在学习如何在linux终端中运行bash脚本,特别是在转换音频视频文件的上下文中。
我在SO上看到了这个命令,它正是我想要的。然而,我想更好地理解它:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
现在,这显然是一个for-loop
,我得到了第一个*
通配符。我得到了do
块。但我不太明白的是${i%.*}
。具体来说,%.*
位在输出位置做什么?为什么不使用${i}.mp4
?
它被称为参数扩展,它删除了从最后一个点开始的所有内容(即扩展(。尝试以下操作:
$ i="foo.bar.baz"
$ echo ${i%.*}
foo.bar
原始代码("${i%.*}.mp4"
(的作者显然想用.mp4
替换原始扩展,因此删除了原始扩展并添加了.mp4
。
参数扩展
${parameter%word}
${parameter%%word}
单词被展开以产生模式,并根据下面描述的规则进行匹配(请参阅模式匹配(。如果模式匹配参数扩展值的尾部,则扩展的结果是删除了匹配模式最短("%"情况(或匹配模式最长("%%"情况(的参数值。