Category Archives: shell

彻底搞透${var##pattern}类用法

我理解后给的定义如下

  • 这是一种根据某个标记删除变量左边或右边片段的用法。
  • 删左边用#,删右边用%,这个好记,#和%在键盘上一个左一个右,看下键盘就清楚。
  • 还有单个符号匹配最少,两个符号匹配最多

所以衍生出四种表达式

${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