6

在编译脚本时,我遇到了命令 do f=${file##*/}。我很想知道##这行是什么意思。感谢您提前回复

4

1 回答 1

22

bash中,它删除了前缀模式。在这里,它基本上为您提供最后一个路径分隔符之后的所有内容/,方法是贪婪地删除前缀*/、任意数量的字符,然后是/):

pax> fspec=/path/to/some/file.txt ; echo ${fspec##*/}
file.txt

在这种情况下,贪婪意味着尽可能多的匹配。还有一个非贪婪的变体(匹配最小的可能序列),以及后缀的等价物:

pax> echo ${fspec#*/}    # non-greedy prefix removal
path/to/some/file.txt
pax> echo ${fspec%%/*}   # greedy suffix removal (no output)
pax> echo ${fspec%/*}    # non-greedy suffix removal
/path/to/some

和大致相当于您分别从##*/和获得的内容,但在其中您不必调用外部程序:%/*basenamedirnamebash

pax> basename ${fspec} ; dirname ${fspec}
file.txt
/path/to/some

对于它的价值,我记住 , , 和 , 的不同效果##%%方式#如下%。它们是各种类型的“去除剂”。

因为#经常出现数字之前(如#1),所以它会在开头删除内容。同样,%通常出现数字 ( 50%) 之后,因此它会在最后删除内容。

那么唯一的区别是贪婪/非贪婪方面。拥有更多角色(##%%)显然意味着你很贪婪,否则你会分享它们:-)

于 2013-04-16T05:08:30.867 回答