2 linux bash shell-script regular-expression
在我的bash脚本我识别机器的名字-kafka01或kafka02或kafka03 与以下正则表达式的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此外,如果机器名mngkafka01或mngkafka02或mngkafka03。
所以我们做了以下工作;run.sh如果机器名称是kafka01ormngkafka01等,这应该运行脚本:
if [[ $(hostname -s) =~ ^[mng]kafka[[:digit:]] ]]
then
/tmp/run.sh
fi
Run Code Online (Sandbox Code Playgroud)
但是这种常规语法不起作用。
我的正则表达式代码有什么问题?
Quasimodo已经给了你为什么你的正则表达式失败的答案。我会建议一种不同的方法。使用case和 globs代替正则表达式:
case $(hostname -s) in
kafka[0-9]*|mngkafka[0-9]*)
/tmp/run.sh
esac
Run Code Online (Sandbox Code Playgroud)
这更容易扩展到更多模式,而且就我个人而言,我发现它更容易阅读。
[mng]不匹配mng,它匹配m或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
Run Code Online (Sandbox Code Playgroud)
输出:
kafka01
mngkafka01
Run Code Online (Sandbox Code Playgroud)
更多信息:条件构造(见[[...]]部分)。
您最初尝试的固定版本:
kafka01
mngkafka01
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |