Como verificar se a string de entrada corresponde a um formato específico?

3

O usuário pode escrever no meu script Bash um endereço mac da seguinte maneira:

read -p "enter mac-address " mac-address

Agora eu quero verificar em uma declaração if, se esse endereço MAC corresponder a um formato "específico". ou seja, deve ser FF:FF:FF:FF:FF:FF e não FFFFFFFFFFFF . Além disso, o comprimento deve estar correto: 6x2.

    
por ipo 08.01.2018 / 19:43

4 respostas

7

A maneira preguiçosa é apenas correr

if [[ $mac_address == ??:??:??:??:??:?? ]]; then echo Heureka; fi

mas isso não verifica se é uma string hexadecimal. Então, se isso é importante

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

pode ser melhor. O último pode ser encurtado para

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

Se o padrão corresponder, não vejo a necessidade de verificar o comprimento correto também.

    
por 08.01.2018 / 19:58
6
[[ $mac_address: =~ ^([[:xdigit:]]{2}:){6}$ ]]
    
por 08.01.2018 / 21:21
4

Eu alterei o nome da variável para que ela consistisse em caracteres legais e usei o operador =~ test para comparar o valor com a correspondência da expressão regular estendida: no início da string ^ , "2 hex dígitos e dois-pontos "5 vezes, seguidos de 2 dígitos hexadecimais, terminando a string $ :

#!/bin/bash

read -p "enter mac-address " mac_address

if [[ $mac_address =~ ^([[:xdigit:]][[:xdigit:]]:){5}[[:xdigit:]][[:xdigit:]]$ ]]
then
  echo good
else
  echo bad
fi
    
por 08.01.2018 / 20:15
0

Com a sintaxe sh padrão (assim funcionaria com bash e qualquer outro shell compatível com POSIX):

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
    
por 08.02.2018 / 14:22