我正在学习一些关于在 linux 终端中运行 bash 脚本的知识,特别是在转换音频视频文件的上下文中。
我在这里遇到了这个命令,这正是我想要的。但是,我想更好地理解它:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
现在,这显然是一个for-loop
,我得到了第一个*
通配符。我明白了do
。但我不太明白的是${i%.*}
。具体来说,该%.*
位在输出位置有什么作用?为什么不${i}.mp4
改用?
我正在学习一些关于在 linux 终端中运行 bash 脚本的知识,特别是在转换音频视频文件的上下文中。
我在这里遇到了这个命令,这正是我想要的。但是,我想更好地理解它:
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
附加。
参数扩展
${参数%字}
${参数%%word}
该词被扩展以产生一个模式并根据下面描述的规则进行匹配(请参阅模式匹配)。如果模式匹配参数扩展值的尾随部分,则扩展结果是具有最短匹配模式('%' 情况)或最长匹配模式('%%' 情况)的参数值已删除。