Bash中的模式匹配

Tim*_*Tim 2 bash pattern-matching

这是获取文件名的不同部分的示例

bash-3.2$ pathandfile=/tmp/ff.txt  
bash-3.2$ filename=$(basename $pathandfile)  
bash-3.2$ echo $filename    
ff.txt    
bash-3.2$ echo ${filename##*.}     
txt    
bash-3.2$ echo ${filename%.*}    
ff    
Run Code Online (Sandbox Code Playgroud)

我想知道##和%在模式中意味着什么.patten匹配如何工作?

感谢致敬!

sth*_*sth 6

联机帮助页bash说:

$ {parameter#word}
$ {parameter ## word}

删除匹配的前缀模式. 这个词被扩展为产生一个模式,就像路径名扩展一样.如果模式匹配参数值的开头,则扩展的结果是参数的扩展值,其中最短匹配模式( #大小写)或最长匹配模式( ##大小写)被删除.如果参数是@*,则模式移除操作依次应用于每个位置参数,并且扩展是结果列表.如果参数是使用@ or 下标的数组变量 *,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表.

$ {parameter%word}
$ {parameter %% word}

删除匹配的后缀模式. 这个词被扩展为产生一个模式,就像路径名扩展一样.如果模式匹配参数的扩展值的尾部,则扩展的结果是具有最短匹配模式(%情况)或最长匹配模式(%%情况)被删除的参数的扩展值.如果参数是@*,则模式移除操作依次应用于每个位置参数,并且扩展是结果列表.如果参数是使用@ or 下标的数组变量 *,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表.