有一些脚本是一句文件名进行处理的,我们可能需要在保留拓展名的同时修改文件名、转换文件格式提取部分文件名。
例如:
提取出文件名:
借助%操作符可以轻松的将名称部分从“名称.拓展名”这种格式的文件名中提取出来。
shu@shu-virtual-machine:~$ file_jpg="sample.jpg"shu@shu-virtual-machine:~$ name=${file_jpg%.*}shu@shu-virtual-machine:~$ echo File name is :$nameFile name is :sampleshu@shu-virtual-machine:~$
提取出拓展名:
借助 #操作符可以将文件的拓展名提取出来:
shu@shu-virtual-machine:~$ extension=${file_jpg#*.}shu@shu-virtual-machine:~$ echo Extension is : $extensionExtension is : jpgshu@shu-virtual-machine:~$
工作原理:
在第一个任务中,为了从“名称.拓展名”这种格式的文件名中提取名称,我们使用% 操作符。
${VAR%.*}的含义是:
从$VAR中删除位于%右侧的通配符所匹配的字符串(在这里是.*)。通配符从右到左进行匹配。
给$VAR复制,VAR=sample.jpg。那么,通配符从右到左就会匹配到.jpg,因此,从$VAR中删除匹配结果,就会得到输出“sample“
%属于非贪婪操作,他从右到左找出匹配通配符的最短结果。还有一个操作符是%% ,这个操作符与%类似,但行为模式是贪婪的,这意味着它会匹配符合条件的最长的字符串。
例如,我们有一个文件
shu@shu-virtual-machine:~$ var=hack.fun.book.txtshu@shu-virtual-machine:~$ echo ${var%.*}hack.fun.bookshu@shu-virtual-machine:~$ echo ${var%%.*}hackshu@shu-virtual-machine:~$
操作符%%用.*从右到左执行贪婪匹配(.fun.book.txt)
第二个任务中,我们使用#操作符从文件名中提取拓展名,这个操作符与%类似,不过求值方向是从左向右。
${VAR*.}的含义是:从$VAR中删除位于#右侧的通配符(即*.)所匹配的的字符串。通配符从左向右进行匹配。
和%%类似,#也有一个相对应的贪婪操作符##。
##从左向右进行贪婪匹配,并从指定变量中删除匹配结果。
例如:
shu@shu-virtual-machine:~$ var=hack.fun.book.txtshu@shu-virtual-machine:~$ echo ${var#*.}fun.book.txtshu@shu-virtual-machine:~$ echo ${var##*.}txtshu@shu-virtual-machine:~$
操作符##从左向右进行贪婪匹配(hack.fun.book.)。