繁体   English   中英

Linux shell脚本中的RegEx Confusion

[英]RegEx Confusion in linux shell script

谁能解释一下这个在linux shell中的作用.....

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

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

我假设$ {devpath ## * [ - 。]}在$ devpath上执行某种正则表达式,但这对我没有意义。 我理解的* [ - 。]也不是指“除了换行符之外的任何一个角色中的任何一个”或者任何其他角色“

当运行脚本(这是来自usb-devices.sh )时,似乎port的值始终是第一个数字。 令我困惑的其他东西是最后的'-1',不应该减少${devpath##*[-.]}做的一个吗?

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

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

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

鉴于变量:

r="/sys/bus/usb/devices/usb2/2-123.45"

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

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

所以使用${r##*[-.]}我们正在将$r所有内容剥离到最后-或者. 找到了。

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

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

按照下面的例子, echo $((${r##*[-.]} - 1))返回44 (45 - 1)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM