谁能解释一下这个在linux shell中的作用.....
port=$((${devpath##*[-.]} - 1))
Run Code Online (Sandbox Code Playgroud)
我有一个名为变量$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"
Run Code Online (Sandbox Code Playgroud)
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))返回44(45 - 1).