如何使用从 bash 中的主机名提取的子字符串来干净地查找值?

问题描述 投票:0回答:1

以下 bash 正则表达式将根据机器主机名设置内存变量

我们实验室里有很多不同名称的机器,如下小例子

presto01
presto02

hadoop01
hadoop02

mngmnthadoop01
mngmnthadoop01
.
.
.

例如,如果主机名 - 包含

presto
name 或
mngmntpresto
name ,则以下 bash 代码会将变量内存设置为 23G

hostname=$( hostname -s )

[[ $hostname =~ (^|^mngmnt)presto[[:digit:]]+$ ]] && memory=23G
        
[[ $hostname =~ (^|^mngmnt)hadoop[[:digit:]]+$ ]] && memory=12G
        
[[ $hostname =~ (^|^mngmnt)kafka[[:digit:]]+$ ]] && memory=10G
.
.
.
    

但据我所知 bash 中的 case 不支持正则表达式 但是按照我解释的那样执行我的代码并不那么优雅,我想知道我们是否可以做得更好?

regex linux bash
1个回答
2
投票

使用捕获组提取主机名中

mngmnt
之后的部分,然后在
case
语句中使用它。

$BASH_REMATCH
是一个包含捕获组匹配的数组。

if [[ $hostname =~ ^(mngmnt)?([[:alpha:]]+)[[:digit:]]+$ ]]
then
    case "${BASH_REMATCH[2]}" in
        presto) memory=23G ;;
        hadoop) memory=12G ;;
        kafka) memory=10G ;;
    esac
fi
© www.soinside.com 2019 - 2024. All rights reserved.