BASH正则表达式匹配MAC地址。

4

我想让用户只能输入有效的MAC地址(例如0a:1b:2c:3d:4e:5f),并希望它比展开形式更加简洁:

[[ $MAC_ADDRESS =~ [a-zA-Z0-9][a-zA-Z0-9]:[a-zA-Z0-9][a-zA-Z0-9]:[a-zA-Z0-9][a-zA-Z0-9]:[a-zA-Z0-9][a-zA-Z0-9]:[a-zA-Z0-9][a-zA-Z0-9] ]]

有没有一种类似这样的方法可以实现呢?
[[ $MAC_ADDRESS =~ ([a-zA-Z0-9]{2}:){5}[a-zA-Z0-9]{2} ]]

实际上,我想创建一个“组”,由两个字母或数字字符后跟一个冒号,然后重复这个过程五次。我已经尝试了我能想到的所有方法,我相当确定这样的事情是可能的。


1
第二个有什么问题吗?我已经测试过了,它是可以工作的。 - hek2mgl
4
POSIX 字符类 [[:xdigit:]] 预定义为 [A-Fa-f0-9] - chepner
你使用的是哪个Bash版本?bash --version - hek2mgl
嗯,对我没用……我的版本是在红帽Linux上的3.1.17(1)。 - user2988671
2个回答

10

我建议使用^$来确保没有其他内容:

[[ "$MAC_ADDRESS" =~ ^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$ ]] && echo "valid" || echo "invalid"

编辑: 在使用正则表达式处理BASH ver 3.1 或更早版本的情况下,您需要引用该正则表达式,因此以下内容应该适用:

[[ "$MAC_ADDRESS" =~ "^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$" ]] && echo "valid" || echo "invalid"

更新:

为了使此解决方案符合旧版和新版的bash版本,我建议先单独声明正则表达式并将其用作以下形式:

re="^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$"
[[ $MAC_ADDRESS =~ $re ]] && echo "valid" || echo "invalid"

我明白这将限制匹配仅限于MAC地址,但是我正在尝试解决仅与bash语法错误有关的问题。它不喜欢带括号的“分组”操作。 - user2988671
我有版本3.1.17(1)。这是在Redhat Linux上。这是仅在3.2中支持的功能吗? - user2988671
你可以尝试在你的Linux上运行 [[ "$MAC_ADDRESS" =~ "^([a-zA-Z0-9]{2}:){5}[a-zA-Z0-9]{2}$" ]] - anubhava
我相信这解决了问题。非常感谢! - user2988671
1
回复晚了,但正则表达式的第二部分应该改为a-fA-F,而不是a-zA-Z。 - MappaM

3
你的建议非常接近正确。不要从A到Z,只需从A到F即可。
^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$

你说的没错,MAC地址只会在f(十六进制)范围内,但这不是我要解决的问题。在执行此操作时,我遇到了错误“-bash:条件表达式中的语法错误:意外的标记('”和“-bash:(['附近的语法错误”。 - user2988671
3
@user2988671 在问题中应该具体说明你遇到了什么错误;没有任何提示说明为什么你的尝试没有成功。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接