Bash中的模式匹配

时间:2010-03-21 18:27:23

标签: 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    

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

谢谢和问候!

3 个答案:

答案 0 :(得分:5)

bash的联机帮助页说:

  

$ {参数#字}
  $ {参数##字}

     
    

删除匹配的前缀模式。扩展单词以生成模式               在路径名扩展中。如果模式匹配参数值的开头,则扩展的结果是带参数的扩展值               最短匹配模式(#情况)或最长匹配模式(               ##案例)已删除。如果参数为@*,则模式删除操作为               依次应用于每个位置参数,并且扩展是结果               名单。如果参数是使用@*下标的数组变量,则为模式               删除操作依次应用于数组的每个成员,并进行扩展               是结果清单。

  
     

$ {参数%字}
  $ {parameter %% word}

     
    

删除匹配的后缀模式。扩展单词以生成模式               在路径名扩展中。如果模式匹配展开的尾部               参数值,则扩展的结果是扩展值               删除最短匹配模式(%情况)或最长匹配模式(%%情况)的参数。如果参数为@*,则删除模式               操作依次应用于每个位置参数,扩展为               结果清单。如果参数是使用@*下标的数组变量,则               模式删除操作依次应用于数组的每个成员               扩展是最终的清单。

  

答案 1 :(得分:3)

来自http://tldp.org/LDP/abs/html/string-manipulation.html

  

$ {串##串}

     

从$ string前面删除$ substring的最长匹配。

  

$ {字符串%子}

     

从$ string后面删除$ substring的最短匹配。

答案 2 :(得分:2)

请参阅http://tldp.org/LDP/abs/html/string-manipulation.html

  
      
  • ${string##substring}      
        
    • 从$ string前面删除$ substring的最长匹配。
    •   
  •   
  • ${string%substring}      
        
    • 从$ string后面删除$ substring的最短匹配。
    •   
  •