有一些脚本需要保留文件名进行处理,或者需要在保留扩展名的前提下修改文件名,转换文件格式,提取部分文件名

借助 %可以轻松的将名称部分从 名称.扩展名的格式之中提取出来,可以按照如下的方法从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, #更适合获取到域名

发表评论

邮箱地址不会被公开。 必填项已用*标注