有一些脚本是一句文件名进行处理的,我们可能需要在保留拓展名的同时修改文件名、转换文件格式提取部分文件名。


例如:

   提取出文件名:

       借助%操作符可以轻松的将名称部分从“名称.拓展名”这种格式的文件名中提取出来。

shu@shu-virtual-machine:~$ file_jpg="sample.jpg"
shu@shu-virtual-machine:~$ name=${file_jpg%.*}
shu@shu-virtual-machine:~$ echo File name is :$name
File name is :sample
shu@shu-virtual-machine:~$

   提取出拓展名:

   借助 #操作符可以将文件的拓展名提取出来:

     

shu@shu-virtual-machine:~$ extension=${file_jpg#*.}
shu@shu-virtual-machine:~$ echo Extension is : $extension
Extension is : jpg
shu@shu-virtual-machine:~$


工作原理:

   在第一个任务中,为了从“名称.拓展名”这种格式的文件名中提取名称,我们使用% 操作符。

${VAR%.*}的含义是:

   从$VAR中删除位于%右侧的通配符所匹配的字符串(在这里是.*)。通配符从右到左进行匹配。

   给$VAR复制,VAR=sample.jpg。那么,通配符从右到左就会匹配到.jpg,因此,从$VAR中删除匹配结果,就会得到输出“sample“

%属于非贪婪操作,他从右到左找出匹配通配符的最短结果。还有一个操作符是%% ,这个操作符与%类似,但行为模式是贪婪的,这意味着它会匹配符合条件的最长的字符串。

例如,我们有一个文件

shu@shu-virtual-machine:~$ var=hack.fun.book.txt
shu@shu-virtual-machine:~$ echo ${var%.*}
hack.fun.book
shu@shu-virtual-machine:~$ echo ${var%%.*}
hack
shu@shu-virtual-machine:~$

操作符%%用.*从右到左执行贪婪匹配(.fun.book.txt)


第二个任务中,我们使用#操作符从文件名中提取拓展名,这个操作符与%类似,不过求值方向是从左向右。

${VAR*.}的含义是:从$VAR中删除位于#右侧的通配符(即*.)所匹配的的字符串。通配符从左向右进行匹配。

和%%类似,#也有一个相对应的贪婪操作符##。

##从左向右进行贪婪匹配,并从指定变量中删除匹配结果。

例如:

shu@shu-virtual-machine:~$ var=hack.fun.book.txt
shu@shu-virtual-machine:~$ echo ${var#*.}
fun.book.txt
shu@shu-virtual-machine:~$ echo ${var##*.}
txt
shu@shu-virtual-machine:~$

操作符##从左向右进行贪婪匹配(hack.fun.book.)。