사용자가 입력한 하위 도메인이 유효한지 확인하려고 하는데, 무엇을 전달해도 작동하지 않습니다. 정규식이 괜찮다는 것을 알고 있으므로 문제는 "if" 논리이지만 쉘/bash는 처음입니다.
#!/bin/bash
#
echo Enter the subdomain\'s name to configure.
read SUBDOMAIN
if [[ ! $SUBDOMAIN =~ [A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])? ]]; then
echo "$SUBDOMAIN is not a valid domain"
fi
예:
허용됩니다(일반 하위 도메인): 테스트가
허용되지 않습니다(유효하지 않은 하위 도메인): -
허용되지 않습니다(유효하지 않은 하위 도메인): (null)
허용되지 않습니다(유효하지 않은 하위 도메인): #$??&@ #&?$ ##$
저는 쉘을 사용하는 것을 선호하지만 정규 표현식의 괄호로 인해 스크립트에서 오류가 발생합니다.
grep으로 할 수 있는지는 잘 모르겠지만, grep을 사용하는 방법을 전혀 이해하지 못했고 항상 혼란스러웠습니다.
답변1
"영숫자" 다음에 "영숫자 또는 대시"를 일치시키고 끝에 대시가 없어 총 1..62자가 되도록 하려는 경우 이 RE가 작동합니다.
^[[:alnum:]](([[:alnum:]]|-){0,61}[[:alnum:]])?$
이는 문자열의 시작과 끝에 바인딩되므로 RE는 전체 문자열과 일치해야 합니다.
- 줄의 시작
^
- 단일 영숫자, 대문자 또는 소문자
[[:alnum:]]
- 선택적 블록(괄호로 묶고
(
...)
로 끝남?
)[[:alnum:]]
또는 대시-
, 0~60회 반복[[:alnum:]]
- 줄 끝
$
[[:alnum:]]
이 답변 아래의 설명에서 제안한 것처럼 범위가 현재 로케일의 영향을 받는다는 점을 지적해야 합니다 . "ASCII" AZ, az 및 0-9만 일치하는지 확인하려면 으로 끝나는지 확인해야 합니다 LANG=C
. 그렇지 않으면 á é ø ß 등과 같은 다른 문자가 허용될 수 있습니다.