bash + 匹配两个不同主机名的正则表达式

bash + 匹配两个不同主机名的正则表达式

在我的 bash 脚本中,我识别机器名称 -kafka01或者kafka02使用kafka03 以下正则表达式 bash 代码

if [[ $(hostname -s) =~ ^kafka[[:digit:]] ]]
then
/tmp/run.sh
fi

命令示例hostname

hostname -s
kafka01

但现在我们想要运行该脚本 -/tmp/run.sh即使机器名称是mngkafka01ormngkafka02mngkafka03

所以我们做了以下事情;run.sh如果机器名称是kafka01或等,这应该运行脚本mngkafka01

if [[ $(hostname -s) =~ ^[mng]kafka[[:digit:]] ]]
then
/tmp/run.sh
fi

但这种常规语法不起作用。

我的正则表达式代码有什么问题?

答案1

卡西莫多已经给你了为什么你的正则表达式失败的答案。我会建议一种不同的方法。使用caseand glob代替正则表达式:

case $(hostname -s) in
  kafka[0-9]*|mngkafka[0-9]*)
    /tmp/run.sh
esac

这更容易扩展到更多模式,而且就我个人而言,我发现它更容易阅读。

答案2

[mng]不匹配,mng它匹配 ormng合适的正则表达式是(^|^mng)kafka[[:digit:]]+$.这匹配

  • (^|^mng)空字符串或mng字符串开头,
  • kafka,
  • [[:digit:]]+$固定在字符串末端的一个或多个数字。

请注意,您之前的正则表达式也会引发误报,因为kafka7u 它没有锚定。

测试:

arr=(kafka01 kafka7u mngkafka01 gkafka7x)
for i in "${arr[@]}"; do
    if [[ $i =~ (^|^mng)kafka[[:digit:]]+$ ]]; then
        echo "$i"
    fi
done

输出:

kafka01
mngkafka01

更多信息:条件结构(见[[...]]章节)。

您最初尝试的固定版本:

if [[ $(hostname -s) =~ (^|^mng)kafka[[:digit:]]+$ ]]
then
    /tmp/run.sh
fi

相关内容