${var#Pattern}, ${var##Pattern}
从$var 开头删除最近或最远匹配$Pattern 的子串.
来自 Example A-7 例子的一部分.
1 # 来自"days-between.sh"例子的一个函数.
2 # 去掉传递进来的参数开头的 0.
3
4 strip_leading_zero () # 去掉开头的 0
5{ #+ 从传递进来的参数中.
6 return=${1#0} # "1"指的是"$1" -- 传进来的参数.
7} # "0"就是我们想从"$1"中删除的子串.
下边是 Manfred Schwarb's 对上边函数的一个改版.
1 strip_leading_zero2 () # 去掉开头的 0,因为如果不去掉的话
# Bash 将会把这个值作为 8 进制解释.
2{
# 打开扩展 globbing.
3 shopt -s extglob
4 local val=${1##+(0)} # 使用局部变量,匹配最长的连续的 0.
# 打开扩展 globbing.
5 shopt -u extglob
6 _strip_leading_zero2=${val:-0}
7 # 如果输入为 0,那么返回 0 来代替"".
8}
另一个例子
1 echo `basename $PWD` # 当前工作目录的 basename.
2 echo "${PWD##*/}" # 当前工作目录的 basename.
3 echo
4 echo `basename $0` # 脚本名字.
5 echo $0 # 脚本名字.
6 echo "${0##*/}" # 脚本名字.
7 echo
8 filename=test.data
9 echo "${filename##*.}" # data
${var%Pattern}, ${var%%Pattern}
从$var 结尾删除最近或最远匹配$Pattern 的子串.
Bash version2 添加了额外的选项.
Example 9-17 参数替换中的模式匹配
################################Start
Script#######################################
1 #!/bin/bash
2 # patt-matching.sh
3
4 # 使用# ## % %%来进行参数替换操作的模式匹配.
5
6 var1=abcd12345abc6789
7 pattern1=a*c # * (通配符) 匹配 a - c 之间的任何字符.
8
9 echo
10 echo "var1 = $var1" # abcd12345abc6789
11 echo "var1 = ${var1}" # abcd12345abc6789
12 # (alternate form)
13 echo "Number of characters in ${var1} = ${#var1}"
14 echo
15
16 echo "pattern1 = $pattern1" # a*c (everything between 'a' and 'c')
17 echo "--------------"
18 echo '${var1#$pattern1} =' "${var1#$pattern1}" # d12345abc6789
19 # 最短的可能匹配, 去掉 abcd12345abc6789 的前 3 个字符
20 # |-| ^^^
21 echo '${var1##$pattern1} =' "${var1##$pattern1}" # 6789
22 # 最远的匹配,去掉 abcd12345abc6789 的前 12 个字符.
23 # |----------| ^^^^
24
25 echo; echo; echo
26
27 pattern2=b*9 # 'b' 到'9'之间的任何字符
28 echo "var1 = $var1" # 还是 abcd12345abc6789
29 echo
30 echo "pattern2 = $pattern2"
31 echo "--------------"
32 echo '${var1%pattern2} =' "${var1%$pattern2}" # abcd12345a
# 最近的匹配, 去掉 abcd12345abc6789 的最后 6 个字符
33
34 # |----| ^^^^
35 echo '${var1%%pattern2} =' "${var1%%$pattern2}" # a
36 # 最远匹配, 去掉 abcd12345abc6789 的最后 12 个字符
37 # |-------------| ^^^^^^
38
39 # 记住, # 和## 从字符串的左边开始,并且去掉左边的字符串,
40 # % 和 %% 从字符串的右边开始,并且去掉右边的子串.
41
42 echo
43
44 exit 0