我理解后给的定义如下
- 这是一种根据某个标记删除变量左边或右边片段的用法。
- 删左边用#,删右边用%,这个好记,#和%在键盘上一个左一个右,看下键盘就清楚。
- 还有单个符号匹配最少,两个符号匹配最多
所以衍生出四种表达式
${var#pattern} 最小匹配左删除
${var##pattern} 最大匹配左删除
${var%pattern} 最小匹配右删除
${var%%pattern} 最大匹配右删除
var为变量 pattern为匹配格式
这样比较抽象,实际举个例子
比如var=”/var/logs/nginx/access.log”,
- 我想取文件名access.log,那么需要删除/左边部分/var/logs/nginx,得出得用#,然后发现左边部分有很多份/分隔得用##,最后左边部分可以用*来表示,pattern就可以写成*/,最后就得到 ${var##*/}
- 我想取文件所在路径 /var/logs/nginx/ ,那么需要删除/右边部分access.log,得出得用%,然后发现只需要匹配一个/分隔,那用单%就可以了,最后右边部分也可以用*表示,pattern可以写成/*,最后得到 ${var%/*}
[root@mail k8s]# var="/var/logs/nginx/access.log"
[root@mail k8s]# echo ${var##*/}
access.log
[root@mail k8s]# echo ${var%/*}
/var/logs/nginx
所以这里的*/ 和 /* 都是匹配的格式,删左边的*写标记符/左边,删右边*就写/右边
再来个例子
还有种用法是重命名”aafad23aa54d11eaaa3efa163e57590a_09Pod管理与使用.pdf”这种类型的文件为”09Pod管理与使用.pdf”,还是讲下逻辑过程:
var=”aafad23aa54d11eaaa3efa163e57590a_09Pod管理与使用.pdf” ,这里要删除”aafad23aa54d11eaaa3efa163e57590a_”部分,很明显可以找出
- 分隔符”_”
- 左删除,用#,最少最多删效果是一样的所以#或##都可以
- 匹配格式写 *_
最终的表达式就是 ${var#*_} 或则 ${var##*_}
[root@mail k8s]# var="aafad23aa54d11eaaa3efa163e57590a_09Pod管理与使用.pdf"
[root@mail k8s]# echo ${var##*_}
09Pod管理与使用.pdf
[root@mail k8s]# echo ${var#*_}
09Pod管理与使用.pdf