重击变量$ {0 ## * /}


8

我试图了解${0##*/}我在bash脚本中遇到的变量。

我知道其中$0包含脚本的名称或路径,然后##${parameter##pattern}source)中的方式工作。

但是我不明白/这里在做什么。我只知道这种带有两个斜杠的语法:${parameter/pat/string}

当我在bash中回显此变量时,我得到了bash:)

最后,我没有共享脚本的权限。我只说变量被调用SOFT="${0##*/}"并在printf语句中使用"Error message sent by $SOFT"

Answers:


12

这样做会削减所有前面的路径元素basename $0。在##试图找到前缀模式的最长匹配的扩展:

$ x=/a/b/c/d
$ echo ${x##*/}
d
$ basename $x
d

从手册页:

${parameter##word}
       Remove matching prefix pattern.  The word is expanded to produce
       a pattern just as in pathname expansion.  If the pattern matches
       the  beginning of the value of parameter, then the result of the
       expansion is the expanded value of parameter with  the  shortest
       matching  pattern  (the ``#'' case) or the longest matching pat‐
       tern (the ``##'' case) deleted.  

使用的原因${0##*/}是它不涉及外部程序调用,但是有点使正在发生的事情难以理解。


只是好奇,您是怎么得到此手册页的?
Psycho Punch

您尝试过man bash然后搜索了parameter##吗?
Anthon '18年

是的,我确实做到了,man bash但是愚蠢的我,我搜寻了,${所以找不到匹配的东西。谢谢。
Psycho Punch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.