【问题标题】:RegEx Confusion in linux shell scriptlinux shell脚本中的正则表达式混淆
【发布时间】:2015-07-15 06:55:17
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 不看你的整个剧本我们怎么知道??

标签: regex linux shell


【解决方案1】:

这里没有正则表达式。 ${var##pattern} 返回 var 的值,并从前缀中删除 pattern 上的任何匹配项(但这是一个全局模式,而不是正则表达式); $((value - 1))value 减一。所以表达式将最后一个破折号或点后面的数字减一。

请参阅 Bash 手册中的 Shell Parameter ExpansionArithmetic Expansion

【讨论】:

    【解决方案2】:

    给定变量:

    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)) 的意思是:将-. 末尾的$devpath 末尾的最后一个数字的值存储在$port 中。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多