在我的 bash 脚本中,我识别机器名称 -kafka01
或者kafka02
使用kafka03
以下正则表达式 bash 代码
if [[ $(hostname -s) =~ ^kafka[[:digit:]] ]]
then
/tmp/run.sh
fi
命令示例hostname
:
hostname -s
kafka01
但现在我们想要运行该脚本 -/tmp/run.sh
即使机器名称是mngkafka01
ormngkafka02
或mngkafka03
。
所以我们做了以下事情;run.sh
如果机器名称是kafka01
或等,这应该运行脚本mngkafka01
:
if [[ $(hostname -s) =~ ^[mng]kafka[[:digit:]] ]]
then
/tmp/run.sh
fi
但这种常规语法不起作用。
我的正则表达式代码有什么问题?
答案1
卡西莫多已经给你了为什么你的正则表达式失败的答案。我会建议一种不同的方法。使用case
and glob代替正则表达式:
case $(hostname -s) in
kafka[0-9]*|mngkafka[0-9]*)
/tmp/run.sh
esac
这更容易扩展到更多模式,而且就我个人而言,我发现它更容易阅读。
答案2
[mng]
不匹配,mng
它匹配 orm
或n
。g
合适的正则表达式是(^|^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