변수에 문자와 숫자가 모두 포함되어 있는지 확인하는 방법

변수에 문자와 숫자가 모두 포함되어 있는지 확인하는 방법

STRLinux에서 쉘 스크립트를 확인하고 "문자만"이 포함되어 있거나 "숫자만"이 포함되어 있으면 종료하려고 합니다 . 숫자와 문자가 모두 포함되어 있으면 STR통과해야 합니다. 특수 문자를 포함하지 않습니다.

비슷한 것을 시도하고 있지만 부분적으로만 작동합니다.

#!/bin/sh

STR=$1

if [[ ! $STR =~ ^[[:alnum:]]*[[:alpha:]][[:alnum:]]*$ ]]; then
    echo "The input must contain both digits and alphabets like abc123"
    exit 1
fi

echo "Success"
exit 0

수표가 부분적으로 유효합니다. 즉, STR숫자만 포함되어 있습니다. 하지만 STR모든 문자가 포함되어 있으면 작동하지 않습니다. 문자와 숫자(예: 또는 )가 포함된 경우에만 수행하고 싶지 않습니다 exit 1.STRabc123ABC123

STR포함된 경우 검사가 실패합니다 abc.

STR포함된 경우 abc에만 수표가 작동하도록 하려면 어떻게 해야 합니까 ?STR123

답변1

여기서는 복잡한 정규식을 사용할 필요가 없습니다. 두 가지 조건이 있으므로 두 가지 테스트를 사용하십시오.

if [[ $str == *[[:digit:]]* ]] &&
   [[ $str == *[[:alpha:]]* ]]
then
    printf '"%s" contains both letters and digits\n' "$str"
else
    printf '"%s" lacks either letters or digits\n' "$str"
fi

"특수 문자"도 언급했지만 해당 문자가 무엇인지는 지정하지 않았습니다. 문자를 [[:punct:]]다음과 일치시키는 것을 의미한다고 가정합니다 .아니요이것을 문자열로 원하려면 다음을 사용할 수 있습니다.

if [[ $str == *[[:digit:]]* ]] &&
   [[ $str == *[[:alpha:]]* ]] &&
   [[ $str != *[[:punct:]]* ]]
then
    printf '"%s" contains both letters and digits, and no specials\n' "$str"
else
    printf '"%s" lacks either letters or digits, or contains specials\n' "$str"
fi

[[:punct:]]문자열의 모든 문자와 일치합니다.

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

답변2

정규식은 문자도 일치하므로 ^[[:alnum:]]*[[:alpha:]][[:alnum:]]*$숫자만 확인하지 않습니다 . 의 하위 집합이어야 하므로 패턴은 완전히 영숫자이고 문자가 하나 이상 포함된 모든 문자열과 일치합니다.[:alnum:][:alpha:][:alnum:]

(일반적인 그리디 매칭을 가정하면 입력이 일치 abcd하면 마지막 항목이 일치 하고 마지막 항목은 아무것도 일치하지 않습니다.)abc[[:alnum:]]*d[[:alpha:]][[:alnum:]]*

문자열에 최소한 하나의 문자와 하나의 숫자가 포함되어 있는지 확인하려면 test [[:alpha:]]및 다음 두 가지 테스트로 분할하는 것이 더 쉽습니다 [[:digit:]].

if [[ $str =~ [[:alpha:]] && $str =~ [[:digit:]] ]]; then
    echo "contains a letter and a digit"

구두점과 같은 다른 내용이 포함된 문자열도 거부하려면 다음 확인 표시를 추가하세요.

if [[ $str =~ [[:alpha:]] && $str =~ [[:digit:]] && ! $str =~ [^[:alnum:]] ]]; then
    echo "contains a letter and a digit, but no non-alphanumerics"

!실패한 사례를 찾으려면 처음부터 전체 테스트를 반대로 수행하십시오( ) if ! [[ ....

(정규식으로 이 작업을 수행하려면 다음과 같이 사용할 수 있습니다.
^([[:alnum:]]*[[:alpha:]][[:alnum:]]*[[:digit:]][[:alnum:]]*|[[:alnum:]]*[[:digit:]][[:alnum:]]*[[:alpha:]][[:alnum:]]*)$ 하지만 조금 무섭습니다.)

답변3

더 간단하게 만들어 보세요. 질문을 두 부분으로 나눕니다.

...
if [[ $STR =~ ([a-zA-Z]+) && $STR =~ ([0-9]+) ]]; then 
...

관련 정보