0

我正在学习一些关于在 linux 终端中运行 bash 脚本的知识,特别是在转换音频视频文件的上下文中。

我在这里遇到了这个命令,这正是我想要的。但是,我想更好地理解它:

for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done

现在,这显然是一个for-loop,我得到了第一个*通配符。我明白了do。但我不太明白的是${i%.*}。具体来说,该%.*位在输出位置有什么作用?为什么不${i}.mp4改用?

4

2 回答 2

1

这称为参数扩展,它会删除从最后一个点开始的所有内容(即扩展名)。尝试以下操作:

$ i="foo.bar.baz"
$ echo ${i%.*}
foo.bar

原始代码 ( "${i%.*}.mp4") 的作者显然想要替换原始扩展名,.mp4因此原始扩展名被删除并.mp4附加。

于 2020-08-29T20:19:53.303 回答
1

参数扩展

${参数%字}

${参数%%word}

该词被扩展以产生一个模式并根据下面描述的规则进行匹配(请参阅模式匹配)。如果模式匹配参数扩展值的尾随部分,则扩展结果是具有最短匹配模式('%' 情况)或最长匹配模式('%%' 情况)的参数值已删除

于 2020-08-29T20:29:24.033 回答