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

Kev*_*Kev 5 bash wildcards

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

OK: DriveC-ReadBytesPerSec: 289283
Run Code Online (Sandbox Code Playgroud)

经过一些试验和错误,我得出了以下结论:

READRESULT="OK: DriveC-ReadBytesPerSec: 289283"
echo ${READRESULT#*:*:*}
Run Code Online (Sandbox Code Playgroud)

哪个输出289283.

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

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

pet*_*eth 11

来自man bash:

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

删除匹配的前缀模式。这个词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式与参数值的开头匹配,则扩展的结果是删除了最短匹配模式(#案例)或最长匹配模式(##案例)的参数的扩展值。

您的模式是*:*:*,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
Run Code Online (Sandbox Code Playgroud)