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

问题描述

我正在学习一些有关在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}

单词将被扩展以产生一个模式,并根据下面描述的规则进行匹配(请参见模式匹配)。如果模式与参数的扩展值的结尾部分相匹配,则扩展的结果就是具有最短匹配模式(“%”大小写)或最长匹配模式( '%%'情况)已删除