有人可以解释这是什么在一个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.45
, echo ${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参数扩展和算术扩展 。