在编写脚本时,我遇到了这个命令:
f=${file##*/}
我很好奇知道这行代码中的##
是什么意思?
pax> fspec=/path/to/some/file.txt ; echo ${fspec##*/}
file.txt
在这个上下文中,贪婪(Greedy)指尽可能地匹配。还有一种非贪婪的变体(匹配最小可能的序列),以及后缀的等效物:
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%
),因此它会删除末尾的内容。
然后唯一的区别就是贪婪/非贪婪方面。拥有更多相同字符(##
或 %%
)显然意味着你很贪心,否则你会分享它们 :-)
%%/*
并不完全替代dirname。如果您向dirname提供一个裸文件名,它会返回'.',而%%/*
则返回未更改的名称。(在脚本中,这可能会导致创建具有文件名的目录,而不是识别当前目录已存在。) - Williamfspec=/path/to/some/file.txt
,我想要以下输出:some/file.txt
。 - A Meriiecho '/path/to/some/file.txt' | perl -pne 's?.*/([^/]*/[^/]*$)?\1?'
:-) - paxdiablosh
),因为它们是POSIX标准的一部分:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html - Patrick Sanan