입력 문자열이 특정 형식을 준수하는지 확인하는 방법은 무엇입니까?

입력 문자열이 특정 형식을 준수하는지 확인하는 방법은 무엇입니까?

사용자는 다음을 통해 내 Bash 스크립트에 mac 주소를 쓸 수 있습니다.

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

이제 이 Mac 주소가 "특정" 형식과 일치하는지 확인하기 위해 if 문을 확인하고 싶습니다. 즉, FF:FF:FF:FF:FF:FF가 아닌 것이 어야 합니다 FFFFFFFFFFFF. 길이도 6x2로 정확해야 합니다.

답변1

가장 게으른 방법은 달리는 것이다

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

그러나 이것은 16진수 문자열인지 확인하지 않습니다. 그러니 중요한 일이라면

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개의 16진수와 콜론"을 5번, 그 다음에는 2번 문자열을 끝내는 16진수 $:

#!/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 호환 셸과 함께 사용할 수 있음):

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

관련 정보