Answers:
${i##*/}
这部作品在Posix的炮弹,其中包括bash
,dash
,ksh
,zsh
,等从标准POSIX参数扩展部分 POSIX的壳牌及公用事业规格:
$ {parameter ## [word]}
删除最大的前缀模式。该词应扩展以产生样式。然后,参数扩展将导致参数被删除,其中前缀的最大部分与模式匹配。
另外,传统上,该basename
命令已用于此目的。 警告:由于性能basename
是作为外部命令(例如/usr/bin/basename
)实现的,因此性能可能成为一个重要问题。因为您是在循环内执行此操作,所以将为每个文件调用一个外部命令。在1000个文件的列表上,这可能是0.05秒(参数扩展)和2.0秒(basename
命令)之间的差。但是对于10,000个文件的列表,可能是0.5秒(扩展)与20秒(basename
)之间的差值。随着文件数量的增加,性能上的差异变得更加极端。
为了提高可读性和性能,您可以实现自己的basename
功能,例如:
mybasename() { echo "${1##*/}"; }
(为函数选择一个更好的名称和/或实现完整的basename
命令行界面,留给读者练习。:)
man basename
和标准POSIX参数扩展。
basename
的下一个代码维护者比参数扩展更容易阅读
ln -s "$i"
将目标的基本名称自动用作链接名称。也是nit:这是一个shell变量(或shell参数),但不是环境变量,因为您没有export
。在外壳程序中它们都可以工作,但是如果您想将信息传递给另一个程序,则区别很重要。