우리는 머신의 호스트 이름을 확인하고 싶습니다. 규칙은 다음과 같아야 합니다:
각 호스트 이름에는 소문자만 사용할 수 있습니다. 각 호스트 이름은 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
과 유사합니다.ksh
zsh
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/정규화된 도메인 이름 확인