用户可以通过以下方式在我的 Bash 脚本中写入 mac 地址:
read -p "enter mac-address " mac-address
现在我想检查一个 if 语句,看看这个 mac 地址是否与“特定”格式匹配。即应该是FF:FF:FF:FF:FF:FF
而不是FFFFFFFFFFFF
。长度也应该正确:6x2。
答案1
最懒的方法就是跑步
if [[ $mac_address == ??:??:??:??:??:?? ]]; then echo Heureka; fi
但这不会检查它是否是十六进制字符串。所以如果这很重要
if [[ $mac_address =~ ^[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]:[0-9a-fA-F][0-9a-fA-F]$ ]]; then echo Heureka; fi
可能会更好。后者可以缩短为
if [[ $mac_address =~ ^([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}$ ]]; then
echo Heureka;
fi
如果模式匹配,我认为也不需要检查正确的长度。
答案2
[[ $mac_address: =~ ^([[:xdigit:]]{2}:){6}$ ]]
答案3
我更改了变量的名称,使其由合法字符组成,然后使用=~
测试运算符将值与扩展正则表达式匹配进行比较:在字符串的开头^
,“2 个十六进制数字和一个冒号”5 次,然后2 个十六进制数字,结束字符串$
:
#!/bin/bash
read -p "enter mac-address " mac_address
if [[ $mac_address =~ ^([[:xdigit:]][[:xdigit:]]:){5}[[:xdigit:]][[:xdigit:]]$ ]]
then
echo good
else
echo bad
fi
答案4
使用标准sh
语法(因此可以bash
与任何其他 POSIX 兼容 shell 一起使用):
x='[[:xdigit:]]'
mac_pattern="$x$x:$x$x:$x$x:$x$x:$x$x:$x$x"
printf >&2 'Please enter a MAC address: '; read mac
case $mac in
($mac_pattern) echo OK;;
(*) echo >&2 BAD;;
esac