${0##*/} 和 ${0%/*} 如何工作?

use*_*099 44 shell bash parameter wildcards

我对在 shell 脚本中找到的以下正则表达式感到非常困惑:

${0##*/}
${0%/*}
Run Code Online (Sandbox Code Playgroud)

它们是如何工作的?

jas*_*yan 49

这些不是正则表达式,它们是 Bash 参数扩展的例子:用它的值替换变量或特殊参数。Wooledge Wiki 有一个很好的解释

基本上,在你的例子中,${0##*/}翻译为:

对于变量 $0 和模式 '/',两个散列表示从参数的开头删除最长(或贪婪)匹配 - 直到并包括该模式。

因此,$0文件名在哪里,例如$HOME/documents/doc.txt,,则参数将扩展为:doc.txt

类似地,对于${0%/*},模式/与参数的结尾(the %) 匹配,并删除最短的或非贪婪的匹配——在上面的例子中,它会给你$HOME/documents

另请参阅Bash Hacker's Wiki上的文章。

  • 一个优点是参数替换不会产生子进程...... (9认同)
  • 它不是特定于 bash 的,它是 POSIX `sh` [指定](http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_02)。 (6认同)
  • glob (`*`) 表示将删除包括模式在内的所有内容。因此,对于参数`#` 的开头,它在左边,结尾`%`,从右边开始。 (4认同)
  • 所以......他们不想使用`basename`和`dirname`?:D (2认同)