对于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,从指定变量中删除匹配结果 |
💡总结
文件名中可能包含多个.字符,所以呢
对于文件名:相较于%%,%更适合于提取文件名。%执行的是非贪婪匹配,只会删除扩展名。
对于扩展名:相较于#,##更适合于从中提取扩展名。##执行的是贪婪匹配,因此能准确的提取扩展名。




近期评论