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

2 linux bash shell-script regular-expression

在我的bash脚本我识别机器的名字-kafka01kafka02kafka03 与以下正则表达式的bash代码

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

hostname命令示例:

hostname -s
kafka01
Run Code Online (Sandbox Code Playgroud)

但现在我们要运行脚本-/tmp/run.sh此外,如果机器名mngkafka01mngkafka02mngkafka03

所以我们做了以下工作;run.sh如果机器名称是kafka01ormngkafka01等,这应该运行脚本:

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

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

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

ter*_*don 9

Quasimodo已经给了你为什么你的正则表达式失败的答案。我会建议一种不同的方法。使用case和 globs代替正则表达式:

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

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

  • 使用 `uname -n` 而不是 `hostname -s` 将使其完全符合 POSIX。但是请注意,`[0-9]*` 与正则表达式 `[[:digit:]]+$` 不同,你需要非标准的 glob 扩展,比如 `zsh -o extendedglob` 的 `[0 -9]##` 或 `ksh`/`zsh -o kshglob`/`bash -o extglob` 的 `+([0-9])`。除了在 C/POSIX 语言环境中,“[0-9]”可能(并且经常)与“[[:digit:]]”或“[0123456789]”不匹配。 (3认同)

Qua*_*odo 7

[mng]不匹配mng,它匹配mng。一个合适的正则表达式是(^|^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
Run Code Online (Sandbox Code Playgroud)

输出:

kafka01
mngkafka01
Run Code Online (Sandbox Code Playgroud)

更多信息:条件构造(见[[...]]部分)。

您最初尝试的固定版本:

kafka01
mngkafka01
Run Code Online (Sandbox Code Playgroud)