Bash ${i%.*}在这种情况下做什么?

Bash ${i%.*}在这种情况下做什么?,bash,parameter-expansion,Bash,Parameter Expansion,我正在学习如何在linux终端上运行bash脚本,特别是在转换音频视频文件的上下文中 我在这里遇到了这个命令,所以这正是我想要的。但是,我想更好地理解它: 用于*.avi中的i;执行ffmpeg-i“$i”“${i%.*}.mp4”;完成 现在,这显然是一个for循环,我得到了第一个*通配符。我得到do块。但我不太明白的是${I%.*}。具体地说,%.*位在输出位置做什么?为什么不改用${i}.mp4呢?它被调用,并从最后一个点(即扩展名)开始删除所有内容。请尝试以下操作: $ i="

我正在学习如何在linux终端上运行bash脚本,特别是在转换音频视频文件的上下文中

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

用于*.avi中的i;执行ffmpeg-i“$i”“${i%.*}.mp4”;完成

现在,这显然是一个
for循环
,我得到了第一个
*
通配符。我得到
do
块。但我不太明白的是
${I%.*}
。具体地说,
%.*
位在输出位置做什么?为什么不改用
${i}.mp4
呢?

它被调用,并从最后一个点(即扩展名)开始删除所有内容。请尝试以下操作:

$ i="foo.bar.baz"
$ echo ${i%.*}
foo.bar
原始代码(
“${i%.*}.mp4”
)的作者显然想用
.mp4
替换原始扩展名,因此原始扩展名被删除,并添加了
.mp4

调用它,它删除从最后一个点开始的所有内容(即扩展名)。请尝试以下操作:

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

原始代码(
“${i%.*}.mp4”
)的作者显然想用
.mp4
替换原始扩展名,因此删除了原始扩展名,并追加了
.mp4

参数扩展

${参数%word}

${parameter%%word}

单词被展开以产生模式,并根据下面描述的规则进行匹配(请参见模式匹配)。如果模式匹配参数扩展值的尾随部分,则扩展的结果是删除了最短匹配模式(“%”大小写)或最长匹配模式(“%”大小写)的参数值


参数扩展

${参数%word}

${parameter%%word}

单词被展开以产生模式,并根据下面描述的规则进行匹配(请参见模式匹配)。如果模式匹配参数扩展值的尾随部分,则扩展的结果是删除了最短匹配模式(“%”大小写)或最长匹配模式(“%”大小写)的参数值


您可能会发现这很有用:您可能会发现这很有用:与其说是“参数扩展”,不如说是“参数扩展”