有一些脚本需要保留文件名进行处理,或者需要在保留扩展名的前提下修改文件名,转换文件格式,提取部分文件名
借助 %可以轻松的将名称部分从 名称.扩展名的格式之中提取出来,可以按照如下的方法从sample.jpg中提取名称
file_jpg=”sample.jpg”
name=${file_jpg%.*}
echo File name is $name
对于扩展名的提取,可以借助#操作符
提取文件名中的.jpg并存储到变量file_jpg之中
extension=${file_jpg#*.}
echo extension is $extension
第一个任务之中,我们从名称.扩展名这种格式的文件名中提取名称,使用了%操作符
${VAR%.*}的含义是
从$VAR 中删除位于 %右侧的通配符,在前面是 .*所匹配的字符串,通配符从右往左
给VAR赋值,VAR是sample.jpg,从右往左匹配,得到了.jpg,因此,删除了.jpg,的匹配记过,得到了sample
%属于非贪婪匹配,从右往左找到第一个就可以了,还有一个操作符%%,这个操作符与%相似,但行为模式是贪婪的,意味着会匹配符合条件的最长字符串
例如,我们有一个这样的文件
VAR=hack.fun.book.txt
使用 %
echo ${VAR%.*}
得到 hack.fun.book
操作符 % 使用 .*表示,从右往左执行非贪婪匹配 .txt
%%操作符
echo ${VAR%%.*}
输出得到 hack
操作符 %%表示 .* 从右往左表示贪婪匹配
得到了.fun.book.txt
第二个语句,我们从#操作符里面提取了扩展名,这个操作符和%类似,不过从左往右
${VAR#*.}含义是,从$VAR中删除位于 # 右侧的通配符,所匹配的字符串,从左往右匹配罢了
和%%类似, #有个贪婪匹配 ##
从左往右的进行贪婪匹配,并从指定的变量中删除匹配的结果
VAR=hack.fun.book,txt
使用#操作符
echo ${VAR#*.}
得到输出 fun.book.txt
操作符 #用*,从左往右执行非贪婪匹配
hack.
使用##操作符
echo ${VAR##*.}
得到输出: txt
操作符 ## 则用*.从左往右执行贪婪匹配
hack.fun.book
因为多了个.字
所以相比较于 # ##更适合从文件名中提取扩展名
而对于URL, #更适合获取到域名