注:区分好通配符和正则表达式的符号含义
通配符:一般只用于文件名匹配
1、*表示匹配任意长度的任意字符
2、? 表示匹配一个任意字符
3、[] 表示匹配括号中列出的字符中的任意一个
4、[a-d]表示aAbBcCd
shell脚本都涉及修改文件名的操作。我们可能需要在保留扩展名的同时修改文件名、转换文件格式(保留文件名的同时修改扩展名)或提取部分文件名。
实战演练(提取文件名):
[root@Script-test ~]# var="index.html"
[root@Script-test ~]# echo${var%.*} %操作符
index
原理:
- 从 $VAR中删除位于%右侧的通配符(在上例中是.*)所匹配的字符串。通配符从右向左进行匹配。
- 给VAR赋值,即VAR=index.html。通配符从右向左匹配到的内容是.html,因此从$VAR中删除匹配结果,得到输出index。
%属于非贪婪(non-greedy)操作。它从右向左找出匹配通配符的最短结果。还有另一个操作符%%,它与%相似,但行为模式却是贪婪的,这意味着它会匹配符合通配符的最长结果。例如,
[root@Script-test ~]# VAR=hack.fun.book.txt 非贪婪模式(%)
[root@Script-test ~]# echo ${VAR%.*}
hack.fun.book
[root@Script-test ~]# VAR=hack.fun.book.txt 贪婪模式(%%)
[root@Script-test ~]# echo ${VAR%%.*}
hack
实战演练(提取扩展名):
原理:#操作符可以从文件名中提取扩展名。这个操作符与%类似,不过求值方向是从左向右。
[root@Script-test ~]# var=test.jpg
[root@Script-test ~]# echo ${var#*.} #操作符
jpg
[root@Script-test ~]# var="www.baidu.com"
[root@Script-test ~]# echo ${var##*.} 贪婪模式(##)
com
[root@Script-test ~]# echo ${var#*.} 非贪婪模式(#)
baidu.com
技巧:切割扩展名的时候贪婪模式(##)更适用,文件名可能会包含多个.字符;譬如var=hack.fun.book.txt,用贪婪模式(##)则可切割出txt
总结:
- 获取文件名使用% (从右向左匹配)
- 获取扩展名使用# (从左向右匹配)
字符串替换
[root@Script-test test]# var="my.file.txt.my"
[root@Script-test test]# echo ${var/my/test} 将第一个my替换成test
test.file.txt.my
[root@Script-test test]# echo ${var//my/test} 将所有my替换成test
test.file.txt.test
单一符号是最小匹配;两个符号是最大匹配
[root@Script-test test]# var="my.file.txt.my"
[root@Script-test test]# echo ${var:0:5} 从左边开始数提取5个字符
my.fi
[root@Script-test test]# echo ${var:5:5} 提取第 5 个字节右边的连续5个字节
le.tx