如何检查输入字符串是否与特定格式匹配?

ido*_*pme 7 bash shell-script

用户可以通过以下方式在我的 Bash 脚本中写入一个 mac 地址:

read -p "enter mac-address " mac-address
Run Code Online (Sandbox Code Playgroud)

现在我想检查一个 if 语句,如果这个 mac 地址与“特定”格式匹配。即它应该FF:FF:FF:FF:FF:FF和不是FFFFFFFFFFFF。长度也应该正确:6x2。

noh*_*ide 12

懒惰的方法就是跑

if [[ $mac_address == ??:??:??:??:??:?? ]]; then echo Heureka; fi
Run Code Online (Sandbox Code Playgroud)

但这不会检查它是否是十六进制字符串。所以如果这很重要

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
Run Code Online (Sandbox Code Playgroud)

可能会更好。后者可以缩短为

if [[ $mac_address =~ ^([[:xdigit:]]{2}:){5}[[:xdigit:]]{2}$ ]]; then
    echo Heureka; 
fi
Run Code Online (Sandbox Code Playgroud)

如果模式匹配,我也不需要检查正确的长度。


Hau*_*ing 6

[[ $mac_address: =~ ^([[:xdigit:]]{2}:){6}$ ]]
Run Code Online (Sandbox Code Playgroud)

  • 这几乎太聪明了,唯一使它起作用的东西有点容易错过。我认为您仍然需要锚定字符串的开头。 (3认同)

Jef*_*ler 5

我更改了变量的名称,使其由合法字符组成,然后使用=~测试运算符将值与扩展正则表达式匹配进行比较:在字符串的开头^,“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
Run Code Online (Sandbox Code Playgroud)