0%

shell提取文件扩展名或文件名


在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