在我的一个 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)