前言

shell越用越强大,一些特殊字符特殊用法比较难记,好记性不如烂笔头,网上摘抄的,留一份日后学习。很多事情其实是可以很好的处理的,一些小东西还是没必要引入python代码,直接shell自身就可以处理完成。

${[#%]} 获取文件名和后缀名

1
2
3
4
5
# f=file.tar.gz
# echo ${f##*.}
gz
# echo ${f%%.*}
file

假设我们定义了一个变量为:

1
file=/dir1/dir2/dir3/my.file.txt

可以用 ${} 分别替换得到不同的值:

  • ${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
  • ${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
  • ${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
  • ${file##*.}:删掉最后一个 . 及其左边的字符串:txt
  • ${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
  • ${file%%/*}:删掉第一个 / 及其右边的字符串:空值
  • ${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
  • ${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:

  • # 是去掉左边(键盘上 #$ 的左边,从左向右删)
  • % 是去掉右边(键盘上 %$ 的右边,从右向左删)
  • 单一符号是最小匹配;两个符号是最大匹配

参考文档

  1. shell编程:冒号后面跟等号,加号,减号,问号的意义
  2. Shell 中的特殊字符