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