RegEx在linux shell脚本中混淆

有人可以解释这是什么在一个Linuxshell…..

port=$((${devpath##*[-.]} - 1)) 

我有一个名为$devpath的variables,一个可能的值是/sys/bus/usb/devices/usb2/2-1

我假设$ {devpath ## * [ – 。]}在$ devpath上执行某种正则expression式,但对我来说没有意义。 也就是我所理解的意思是“任何一个字符中的一个”或“除了换行符之外的任何其他字符”的* [ – 。]

当通过一个脚本运行(这是从usb-devices.sh ),似乎端口的值始终是第一个数字数字。 还有一些让我困惑的是最后的'-1',不应该减less${devpath##*[-.]}所做的一切吗?

我试图在shellexpression式中查找正则expression式,但没有任何意义,没有我能find##的解释。

给定变量:

 r="/sys/bus/usb/devices/usb2/2-123.45" 

echo ${r##*-}返回123.45echo ${r##*[-.]}返回45 。 你看到这里的模式吗?

让我们再深入一点: ${string##substring}表达式从$string的前面$substring的最长匹配。

所以用${r##*[-.]}我们剥离了$r所有内容,直到最后-或者. 被发现。

然后, $(( ))用于算术表达式。 因此,使用$(( $var - 1 ))您将从${r##*[-.]}中减去1

所有在一起, port=$((${devpath##*[-.]} - 1))意味着:存储$port后的最后一个数字的值-.$devpath

按照下面的例子, echo $((${r##*[-.]} - 1))返回44 (45 – 1)。

这里没有正则表达式。 ${var##pattern}返回var与从前缀中移除的任何pattern匹配的值(但是这是一个glob模式,而不是正则表达式)。 $((value - 1))value减去1。 所以表达式取最后的短划线或点后面的数字,并将其减一。

请参阅Bash手册中的Shell参数扩展和算术扩展 。