有一些脚本是根据文件名进行各类处理的。 shell所具备的一些内建功能能够依据不一样的状况来切分文件名。shell
借助%操做符能够轻松的将名称部分从"名称.扩展名"这种格式中提取出来。能够按照下面的方法从list.txt中提取名称。google
# file_name="list.txt" # name=${file_name%.*} # echo File name is: $name 输出结果:File name is: list
下一个是将文件名的扩展名部分提取出来,这能够借助#操做符实现。code
# name=${file_name#*.} # echo Extension is: $name 输出结果:Extension is txt
工做原理: 在第一个任务里,为了从"名称.扩展名"这个格式中提取名称,咱们使用了%操做符。字符串
${VAR%.*} 的含义以下:域名
从$VAR中删除位于%右侧的通配符(在前例中是.*)全部匹配的字符串。通配符从右向左进行匹配。io
给$VAR赋值,VAR="list.txt"。那么,通配符从右向左就会匹配到.txt,所以,从$VAR中删匹配的结果,就会获得输出list变量
%属于非贪婪操做,它从右到左找出匹配通配符最短的结果。还有另一个操做符%%,这个操做符与%类似,可是它的行为模式倒是贪婪的,这说明它会匹配符合条件的最长的字符。原理
好比,咱们有这样一个文件:扩展
# VAR="hack.fun.book.txt" # echo ${VAR%.*} 输出结果:hack.fun.book
操做符%使用.*从右到左执行非贪婪匹配(.txt)file
使用%%操做符:
# echo ${VAR%%.*} 输出结果:hack
操做符%%使用.*从右到左执行贪婪匹配(.fun.book.txt)
在第二个任务中,咱们用#操做符从文件名中提取扩展名。这个操做与%相似,不过求值方向是从左到右。
${VAR#*.}的含义以下:
从$VAR中删除位于#右侧的通配符(即在前例中使用的*.)所匹配的字符串。通配符从左向右进行匹配。
和%%相似,#也有一个贪婪操做符##
##从左向右进行贪婪匹配,并从指定变量中删除匹配结果。
来看一个例子:
# VAR="hack.fun.book.txt"
使用#操做符:(非贪婪)
# echo ${VAR#*.} 输出结果:fun.book.txt
使用##操做符:(贪婪)
# echo ${VAR##*.} 输出结果:.txt
注意:
由于文件名中可能包含多个'.'字符,因此相较于#,##更适合从文件名中提取扩展名。##执行的是贪婪匹配,所以老是可以准确的提取出扩展名。
这里咱们使用一个域名来作个总结:URL="www.google.com"
# echo ${URL%.*} #移除.*所匹配的最右边的内容 输出:www.google # echo ${URL%%.*} #将从右边开始一直匹配到最左边的.*移除(贪婪操做符) 输出:www # echo ${URL#*.} #移除*.所匹配的最左边内容 输出:google.com #echo ${URL##*.} #将从左边开始一直匹配到最右边的*.移除(贪婪操做符) 输出:com