STR
Linux에서 쉘 스크립트를 확인하고 "문자만"이 포함되어 있거나 "숫자만"이 포함되어 있으면 종료하려고 합니다 . 숫자와 문자가 모두 포함되어 있으면 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
.STR
abc123
ABC123
STR
포함된 경우 검사가 실패합니다 abc
.
STR
포함된 경우 abc
에만 수표가 작동하도록 하려면 어떻게 해야 합니까 ?STR
123
답변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
...