使用变量操作符 ${}
1、单个#符:截掉左侧,非贪婪匹配
${var#*.}
该方式是从左开始第一次匹配到字符".",然后截掉左边内容(包括字符"."),返回余下右侧部分。
$ var=/dir1/dir2/file.tar.gz
$ echo ${var#*.}
tar.gz
2、双#符:截掉左侧,贪婪匹配
${var##*/}
该方式是从左开始最大化匹配到字符"/",然后截掉左边内容(包括字符"/"),返回余下右侧部分。
$ var=/dir1/dir2/file.tar.gz
$ echo ${var##*.}
gz
当然,匹配字符不仅仅是*.和*/之类的,也可以是其他的值
注意,匹配规则遵循的是shell的通配符规则,不是正则表达式
$ var=/dir1/dir2/file.tar.gz
$ echo ${var##*tar}
.gz
3、单个%符:截掉右侧,非贪婪匹配
${var%/*}
该方式是从右开始第一次匹配到字符"/",然后截掉右边内容(包括字符"/"),返回余下左侧部分。
$ var=/dir1/dir2/file.tar.gz
$ echo ${var%/*}
/dir1/dir2
4、双%符:截掉右侧,贪婪匹配
${var%%.*}
该方式是从右开始最大化匹配到字符".",然后截掉右边内容(包括字符"."),返回余下左侧部分。
$ var=/dir1/dir2/file.tar.gz
$ echo ${var%%.*}
/dir1/dir2/file
通常用法
${var##*/} 提取文件名
${var##*.} 提取文件名后缀
${var%/*} 提取文件路径
有一个问题值得记录一下:
第一个例子中var=/dir1/dir2/file.tar.gz时,通过命令${var#*.}能提取tar.gz
但是如果路径中含有字符"."会使结果不符合预期
$ var=/dir1/dir2.2/file.tar.gz
$ echo ${var#*.}
2/file.tar.gz
怎么办呢?我的建议是先${var##*/} 提取文件名,再${var#*.}提取后缀,如果谁有更好的办法,欢迎留言
本文参考了:https://blog.csdn.net/universe_hao/article/details/52640321,并在此基础上做了整理和补充