
다음 조건으로 비밀번호 입력 템플릿을 만들고 싶습니다.
- 비밀번호 길이는 12자 이상이어야 합니다.
- 최소 1개의 소문자, 1개의 대문자, 1개의 숫자, 1개의 특수문자가 있어야 합니다.
- 다음과 같은 특정 특수 문자<>``````~허용되지 않습니다.
- 처음 세 가지 조건이 충족되는 한 순서는 중요하지 않습니다.
패턴을 만들기 위해 부정적인 예측을 활용했지만 작동하지 않습니다. 내 패턴:
^(.{0,11}|[^0-9]*|[^A-Z]*|[^a-z]*|[a-zA-Z0-9<>~`|"\']*|[^\s]*\s.*)$
운영 체제: 우분투 20.04
답변1
귀하의 질문에는 표현을 어떻게 사용하려고 하는지 언급되어 있지 않습니다. 셸의 정규식은 bash
POSIX 확장 정규식입니다. 이는 긍정적이거나 부정적인 미리보기 또는 뒤돌아보기를 지원하지 않습니다.
표현식을 사용하여 더 많은 내용을 적용하는 대신 테스트를 여러 개의 별도 테스트로 나누는 것이 좋습니다.
모든 작업을 수행하기 위해 괴물 같은 표현을 만들려고 노력하는 것보다 각 테스트가 독립적으로 수행되는 경우 구현을 이해하고 유지 관리하는 것이 가장 쉽습니다.
#!/bin/bash
pw_is_valid () {
local avoid='[<>`"'"'"'~]'
[ "${#1}" -ge 12 ] &&
[[ $1 =~ [[:upper:]] ]] &&
[[ $1 =~ [[:lower:]] ]] &&
[[ $1 =~ [[:digit:]] ]] &&
[[ $1 =~ [[:punct:]] ]] &&
[[ ! $1 =~ $avoid ]]
}
until
IFS= read -r -s -p 'Enter password: ' pw
pw_is_valid "$pw"
do
echo 'Try again' >&2
done
avoid
정규식 [<>`"'~]
을 표현하는 데 필요한 참조 수를 줄이기 위해 변수를 사용하여 정규식을 유지합니다.
POSIX
일명 로케일 에서 C
POSIX [:punct:]
문자 클래스에는 다음 문자 세트의 문자가 포함됩니다.
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
일반 영역에는 일반적으로 더 많은 콘텐츠가 있습니다.
여기서는 "특수 문자"를 대신하여 사용하고 있습니다.
1 예를 들어 Ubuntu 20.04 및 en_GB.UTF-8 로케일에는 147495개의 서로 다른 문자가 포함되어 있습니다. YMMV는 시스템, 버전 및 로케일에 따라 다릅니다.