在编译脚本时,我遇到了命令 do f=${file##*/}
。我很想知道##
这行是什么意思。感谢您提前回复
问问题
8523 次
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
和大致相当于您分别从##*/
和获得的内容,但在其中您不必调用外部程序:%/*
basename
dirname
bash
pax> basename ${fspec} ; dirname ${fspec}
file.txt
/path/to/some
对于它的价值,我记住 , , 和 , 的不同效果##
的%%
方式#
如下%
。它们是各种类型的“去除剂”。
因为#
经常出现在数字之前(如#1
),所以它会在开头删除内容。同样,%
通常出现在数字 ( 50%
) 之后,因此它会在最后删除内容。
那么唯一的区别是贪婪/非贪婪方面。拥有更多角色(##
或%%
)显然意味着你很贪婪,否则你会分享它们:-)
于 2013-04-16T05:08:30.867 回答