Linux shell脚本中的RegEx Confusion

Lit*_*Jim 3 regex linux shell

谁能解释一下这个在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表达式中查找正则表达式,但没有任何意义,也没有找到解释##.

tri*_*eee 5

这里没有正则表达式.${var##pattern}返回从前缀中删除的var任何匹配的值pattern(但这是一个glob模式,而不是正则表达式); $((value - 1))从中减去一个value.因此,表达式采用最后一个破折号或点后的数字并将其减少一个.

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


fed*_*qui 5

鉴于变量:

r="/sys/bus/usb/devices/usb2/2-123.45"
Run Code Online (Sandbox Code Playgroud)

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

让我们再进一步:表达式从前面${string##substring}剥去最长的匹配.$substring$string

因此,${r##*[-.]}我们正在剥离所有内容$r直到最后-或被.发现.

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

总之,port=$((${devpath##*[-.]} - 1))意味着:存储在$port任何一个-.结尾之后的最后一个数字的值$devpath.

按照以下示例,echo $((${r##*[-.]} - 1))返回44(45 - 1).

  • @LittleJim由于你是新来的,如果问题已经解决,请不要忘记接受答案.您可以单击答案旁边的复选标记将其从空心切换为绿色.如果您有任何疑问,请参阅[帮助中心>提问](http://stackoverflow.com/helpcenter/someone-answers)! (3认同)