这个通配表达式如何/为什么起作用?

这个通配表达式如何/为什么起作用?

在我的一个 bash 脚本中,我需要获取冒号分隔字符串的最后一部分。例如,我需要289283从以下值中获取数值:

OK: DriveC-ReadBytesPerSec: 289283

经过一番尝试和错误后,我得出以下结论:

READRESULT="OK: DriveC-ReadBytesPerSec: 289283"
echo ${READRESULT#*:*:*}

哪个输出289283.

问题是,虽然它完成了工作,但我不完全理解为什么${READRESULT#*:*:*}会产生正确的结果。

谁能解释一下这个通配符表达式是如何工作的?

答案1

man bash

${参数#word}
${参数##word}

删除匹配的前缀模式。该单词被扩展以产生一个模式,就像路径名扩展一样。如果模式与parameter值的开头匹配,则扩展的结果是parameter的扩展值,并删除最短匹配模式(case #)或最长匹配模式(##case)。

您的模式是*:*:*,bash并将尝试删除最短的匹配前缀:

  • OK:为了第一*:
  • DriveC-ReadBytesPerSec:第二个*:
  • 最后一个没有任何内容*,因为它适用于最短的匹配。

比较:

$ # shortest match without surplus *
$ echo ${READRESULT#*:*:}
289283
$ # going for longest match now; the last * will swallow the number
$ echo ${READRESULT##*:*:*}

$ # longest match without the last *
$ echo ${READRESULT##*:*:}
289283
$ # no need to repeat *: because * matches everything before the last : anyway
$ echo ${READRESULT##*:}
289283

相关内容