在shell中用于提取文件名或后缀,需要用到以下几个操作符: %、%%、#、##
% 和 %% 操作符
用法:
${VAR%.*}
${VAR%%.*}
${VAR%.*}含义:从$VAR中删除位于 % 右侧的通配符左右匹配的字符串,通配符从右向左进行匹配。
- % 属于非贪婪操作符,从右向左匹配最短结果
- %% 属于贪婪操作符,从右向左匹配符合条件的最长字符串
示例如下:
file="abc.c"
name=${file%.*}
echo file name is: $name
输出结果:
file name is: abc
变量 name 赋值abc.c,那么通配符从右向左就会匹配到 .c,所有从 $VAR 中删除匹配结果。
file="text.gif.bak.2012"
name=${file%.*}
name2=${file%%.*}
echo file name is: $name
echo file name is: $name2
输出结果:
file name is: text.gif.bak //使用 %
file name is: text //使用 %%
操作符 %% 使用 .* 从右向左贪婪匹配到 .gif.bak.2012
# 和 ## 操作符
用法:
${VAR#*.}
${VAR##*.}
${VAR#*.} 含义:从 $VAR 中删除位于 # 右侧的通配符所匹配的字符串,通配符是左向右进行匹配。
- # 属于非贪婪操作符,从左向右匹配最短结果
- ## 属于贪婪操作符,从左向右匹配符合条件的最长字符串
符示例:
file="text.gif"
suffix=${file#*.}
echo suffix is: $suffix
输出结果:
suffix is: gif
file="text.gif.bak.2012.txt"
suffix=${file#*.}
suffix2=${file##*.}
echo suffix is: $suffix
echo suffix is: $suffix2
输出结果:
suffix is: text.gif.bak.2012 //使用 #
suffix2 is: txt //使用 ##
操作符 ## 使用 *. 从左向右贪婪匹配到 text.gif.bak.2012
示例
url="www.baidu.com"
echo ${url%.*} #移除 .* 所匹配的最右边的内容。
www.baidu
echo ${url%%.*} #将从右边开始一直匹配到最左边的 *. 移除,贪婪操作符。
www
echo ${url#*.} #移除 *. 所有匹配的最左边的内容。
baidu.com
echo ${url##*.} #将从左边开始一直匹配到最右边的 *. 移除,贪婪操作符。
com