사용자는 다음을 통해 내 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