有人可以解释一下这在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.45
,echo ${r##*[-.]}
返回45
。您在这里看到图案了吗?让我们再进一步一点:
${string##substring}
表达式从$substring
的开头剥离了最长的$string
匹配项。因此,使用
${r##*[-.]}
,我们将剥离$r
中的所有内容,直到找到最后一个-
或.
。然后,
$(( ))
用于算术表达式。因此,使用$(( $var - 1 ))
,您将从1
的值中减去${r##*[-.]}
。总之,
port=$((${devpath##*[-.]} - 1))
的意思是:在$port
末尾的-
或.
之后存储最后一个数字的值。在下面的示例中,
$devpath
返回echo $((${r##*[-.]} - 1))
(45-1)。