问题描述
我正在学习一些有关在Linux终端中运行bash脚本的知识,特别是在转换音频视频文件的上下文中。
我在SO上遇到了此命令,该命令正是我想要的。但是,我想更好地理解它:
for i in *.avi; do ffmpeg -i "$i" "${i%.*}.mp4"; done
现在,这显然是for-loop
,我得到了第一个*
通配符。我得到了do
块。但是我不太了解的是${i%.*}
。具体来说,%.*
位在输出位置做什么?为什么不改用${i}.mp4
?
解决方法
它称为parameter expansion,它将删除从最后一个点(即扩展名)开始的所有内容。请尝试以下操作:
select v.id,v.name,m.id as model_id,m.name,s.qty,p.price
from vehicles v
join models m on v.id = m.vehicle_id
join (
select *
from stocks st
where id = (
select max(id)
from stocks
where st.vehicle_id =vehicle_id
and st.model_id = model_id
)
) s
on v.id = s.vehicle_id
and m.id = s.model_id
join (
select *
from prices pr
where id = (
select max(id)
from prices
where pr.vehicle_id =vehicle_id
and pr.model_id = model_id
)
) p on v.id = p.vehicle_id
and m.id = p.model_id
原始代码($ i="foo.bar.baz"
$ echo ${i%.*}
foo.bar
)的作者显然想用"${i%.*}.mp4"
替换原始扩展名,以便删除原始扩展名并附加.mp4
。
参数扩展
$ {parameter%word}
$ {parameter %% word}
单词将被扩展以产生一个模式,并根据下面描述的规则进行匹配(请参见模式匹配)。如果模式与参数的扩展值的结尾部分相匹配,则扩展的结果就是具有最短匹配模式(“%”大小写)或最长匹配模式( '%%'情况)已删除。