FQDN 호스트 이름에 소문자만 포함되어 있는지 확인하는 방법

FQDN 호스트 이름에 소문자만 포함되어 있는지 확인하는 방법

우리는 머신의 호스트 이름을 확인하고 싶습니다. 규칙은 다음과 같아야 합니다:

각 호스트 이름에는 소문자만 사용할 수 있습니다. 각 호스트 이름은 FQDN이어야 합니다.

이것을 시도해 보자

hostname=master01.nassa.com
[[ $hostname  =~ ^[a-z.a-z.a-z]+$ ]] && hostname is ok

그러나 호스트 이름이 유효하더라도 "Hostname is OK"가 인쇄되지 않습니다.

올바른 구문은 무엇이며 무엇이 잘못되었나요?

답변1

&&귀하의 정규식은 어떤 면에서 잘못되었으며 그 이후의 부분이 누락되었습니다 echo. 호스트 이름의 유효성을 검사하기 위해 복잡한 정규식을 작성하는 대신 반대 작업을 수행하는 것을 고려할 수 있습니다.

hostname=master01.naSsa.com
[[ $hostname  =~ [A-Z] ]] && echo "hostname is not ok"
hostname is not ok

또는

hostname=master01.nassa.com
[[ $hostname  =~ [A-Z] ]] || echo "hostname is ok"
hostname is ok

LC_ALL=C
또한 복잡함을 피하기 위해 다음을 사용하여 로케일을 C 또는 posix로 정의하는 것이 좋습니다 .[AZ]가 bash에서 소문자와 일치하는 이유는 무엇입니까?

답변2

/bin/sh솔루션 의 경우 :

hostname=master01.nassa.com

case $hostname in
    *[A-Z]*)
        echo 'Not ok' ;;
    *)
        echo 'Ok'
esac

값에 $hostname대문자가 포함되어 있으면(로케일에 따라 다를 수 있음) "Not ok" 분기가 선택되고, 그렇지 않은 경우 "Ok" 분기가 선택됩니다.

이는 -specic ( 및 ) bash과 유사합니다.kshzsh

if [[ "$hostname" == *[A-Z]* ]]; then
    echo 'Not ok'
else
    echo 'Ok'
fi

정규식을 사용한 테스트는 를 ^[a-z.a-z.a-z]+$사용한 테스트와 동일합니다 ^[a-z.]+$( [...]문자 클래스가 단일 문자와 일치하고 a-z그 안에서 반복해도 차이가 없기 때문입니다). 이것은 실제로 당신이 원하는 것을 할 것입니다설명하다호스트 이름에는 소문자(및 점)만 허용되는 것이 사실입니다. 문제는 호스트 이름에도 숫자가 포함되어 있다는 것입니다. 이러한 사항도 고려하려면 를 사용해야 합니다 ^[a-z0-9.]+$. 하지만 이 경우 더 작은 문자 집합으로 테스트하는 것이 더 쉬울 수 있습니다.아니요허용됩니다. 그게 제가 위에서 한 일입니다.

답변3

hostname=master01.nassa.com
[[ "$hostname"  =~ ^[a-z]+\.[a-z]+\.[a-z]+$ ]] && echo hostname is ok

귀하의 예시에서 일부 버그가 수정되었으나 보다 정확한 확인을 위해 다음을 확인하세요.https://stackoverflow.com/questions/11809631/정규화된 도메인 이름 확인

관련 정보