有人可以解释一下这在Linux shell中的作用.....

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

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

我假设$ {devpath ## * [-。]}在$ devpath上执行某种正则表达式,但这对我来说没有任何意义。我理解的* [-。]也不意味着“字符'-'或除换行符以外的任何其他字符中的一个或多个”

通过脚本运行时(来自usb-devices.sh),似乎port的值始终是第一个数字。让我感到困惑的还有最后一个是“-1”,难道这不应该使${devpath##*[-.]}减少一倍吗?

我尝试在shell表达式中查找正则表达式,但没有任何意义,也没有哪里可以找到##的解释。

最佳答案

给定变量:

r="/sys/bus/usb/devices/usb2/2-123.45"
echo ${r##*-}返回123.45echo ${r##*[-.]}返回45。您在这里看到图案了吗?

让我们再进一步一点:${string##substring}表达式从$substring的开头剥离了最长的$string匹配项。

因此,使用${r##*[-.]},我们将剥离$r中的所有内容,直到找到最后一个-.

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

总之,port=$((${devpath##*[-.]} - 1))的意思是:在$port末尾的-.之后存储最后一个数字的值。

在下面的示例中,$devpath返回echo $((${r##*[-.]} - 1))(45-1)。

09-13 06:34