通过参数扩展获取字段名和字段值

通过参数扩展获取字段名和字段值

我有一个名为 bash 变量flentry,它由以下部分组成:

File: Value

或者

+ Value

用过的

fld="${flentry%[[:blank:]]*}" 

fl="${flentry#*[[:blank:]]}" 

获取字段名称File:+,而fl获取值。

看起来好像 bash 参数扩展使用了正则表达式模式,或者我错了?

我理解%删除最短尾随匹配,同时#删除最小尾随匹配。但我不明白如何fld分别fl获取字段名称和字段值。

答案1

形式${parameter#word}${parameter%word}${parameter##word}${parameter%%word}POSIX 规范的一部分参数扩展在所有情况下,word都被视为与文件名生成(“glob”)表达式相同,如模式匹配符号。虽然这些模式与正则表达式有一些表面上的相似之处,但它们不是正则表达式-参见示例正则表达式与用于过滤文件的通配符有何不同

bash shell 通过多种方式扩展了该规范;例如

  • bash 允许使用 regex-style[^...]作为 POSIX 的替代方案[!...]来反转字符集

  • (当extglob启用 shell 选项时)bash 支持 ksh 样式的扩展 glob,类似+(foo|bar)正则表达式的交替和量词功能。

有关完整详细信息,请参阅 bash 手册中的模式匹配

因此,fld="${flentry%[[:blank:]]*}"扩展变量flentry,从其末尾删除与空白(空格或制表符)字符匹配的最短子字符串,后面跟着零个或多个其他字符(即最后的空格或制表符添加到字符串末尾)。 如果flentry包含字符串File: Value,则结果为File:

类似地,fl="${flentry#*[[:blank:]]}"扩展flentry,从其开头删除与零个或多个字符匹配的最短子字符串,后跟一个空格或制表符(即从字符串开头到包括第一的空格或制表符),结果为Value

请注意,如果字段名称和值之一或两者均包含空格,则这种分隔字段名称和值的方法将失败。看来您确实应该使用:[[:blank:]]作为分隔符。

相关内容