shell中切分文件名和扩展名

对于shell涉及的修改文件名的操作,我们可能需要提取某个文件名,或者提取某个文件的扩展名。get✔
根据扩展名切分文件名
截取文件名称示例:
1 | $ cat file.sh |
输出结果如下:
1 | $ ./file.sh |
截取文件扩展名示例:
1 | $ cat file1.sh |
输出结果如下:
1 | $ ./file1.sh |
${VAR%.*}
工作原理:
- 从
$VAR
中删除位于%
右侧的通配符(在上例中式.*
),通配符从右向左进行匹配。 - 给
VAR
赋值,即VAR=sample.jpg
,通配符从右向左匹配得到的内容是.jpg
,因此从$VAR
中删除匹配结果,得到输出结果sample。
💡 那么,有没有考虑过,要是文件名有很多后缀呢cute.a.b.c.d.txt
?要是提取的变量为域名www.google.com
呢?有的是办法,往下看~
%属于非贪婪匹配,它从右向左找出匹配通配符的最短结果。还有另一个操作符%%,它于%相似,但行为模式确是贪婪的,它会匹配符合通配符的最长结果。
1 |
|
${VAR#*.}
工作原理:
- 从
$VAR
中删除位于#
右侧的通配符(上个栗子中使用的*.
),从左到右匹配字符串。 - 和
#
对应的贪婪操作是##
1 | # 从右到左进行非贪婪匹配,得到匹配结果hack,从指定变量中删除匹配结果 |
💡总结
文件名中可能包含多个.字符,所以呢
对于文件名:相较于%%,%更适合于提取文件名。%执行的是非贪婪匹配,只会删除扩展名。
对于扩展名:相较于#,##更适合于从中提取扩展名。##执行的是贪婪匹配,因此能准确的提取扩展名。