![$를 테스트하는 이유는 무엇입니까? -eq 0은 거짓일 것으로 예상하더라도 참입니다.](https://linux55.com/image/91515/%24%EB%A5%BC%20%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20-eq%200%EC%9D%80%20%EA%B1%B0%EC%A7%93%EC%9D%BC%20%EA%B2%83%EC%9C%BC%EB%A1%9C%20%EC%98%88%EC%83%81%ED%95%98%EB%8D%94%EB%9D%BC%EB%8F%84%20%EC%B0%B8%EC%9E%85%EB%8B%88%EB%8B%A4..png)
이 셸 스크립트(비밀번호 확인)로 여전히 어려움을 겪고 있어 해결책을 찾았지만 여전히 올바른 해결책을 찾을 수 없습니다.
#!/bin/sh
echo "enter the password"
read password
len="${#password}"
if test $len -ge 8 ; then
echo "$password" | grep -q [A-Z]
echo "$password" | grep -q [a-z]
echo "$password" | grep -q [0-9]
if test $? -eq 0 ; then
echo "Strong password"
else
echo "Weak password"
fi
else
echo "password lenght should be greater than or equal 8"
fi
이 스크립트의 결과는 다음과 같습니다.
# ./password.sh
enter the password
12345678
Strong password >> Not as I expected which is should be weak password
내 잘못이 뭐예요?
답변1
무엇:
read
없이 사용하면 비밀번호가-r
어려워집니다.\
정규식을 인용하지 않으면 쉘이 이를 와일드카드 패턴으로 처리하고 파일 이름으로 확장됩니다.
이
$?
변수는 마지막 종료 상태만 보유합니다grep
.
다음을 고려하세요bash
스크립트:
#!/bin/bash
read -r -p "password:" -s password
if (( ${#password} < 8 )); then
echo "Passwords need 8 or more characters"
exit 1
fi
has_upcase=0
has_locase=0
has_digit=0
has_other=0
case "$password" in
*[[:upper:]]*) has_upcase=1 ;;&
*[[:lower:]]*) has_locase=1 ;;&
*[[:digit:]]*) has_digit=1 ;;&
*[^[:alnum:]]*) has_other=1 ;;
esac
if (( !has_upcase )); then
echo "Make sure you password has at least one upper-case letter"
elif (( !has_locase )); then
echo "Make sure your password has at least one lower-case letter"
elif (( !has_digit )); then
echo "Make sure your password has at least one digit"
elif (( !has_other )); then
echo "Make sure your password has at least non-alphanumeric character"
else
echo "Your password is ok"
fi
나는 테스트에 "영숫자가 아닌" 요구 사항을 자유롭게 추가했습니다.
of는 사용자에게 프롬프트를 제공하고 입력된 내용을 에코하지 않고 읽을 수 있습니다 read
.bash
이 case
명령문은 입력된 비밀번호에 대문자 1개, 소문자 1개, 숫자 1개, 영숫자가 아닌 문자 1개 이상이 포함되어 있는지 확인합니다(다음 사용).POSIX 문자 클래스). ;;&
각 줄 끝의 펑키한 모양은 "다음 패턴을 테스트하기 위해 이 문자열을 계속 사용한다"는 의미입니다.
sh
POSIX 변형을 얻으려면 다음 read
으로 바꾸십시오.
stty -echo
printf "password: "
read -r password
stty echo
printf "\n"
그리고 case
비슷한 진술
case "$password" in *[[:upper:]]*) has_upcase=1 ;; esac
case "$password" in *[[:lower:]]*) has_locase=1 ;; esac
case "$password" in *[[:digit:]]*) has_digit=1 ;; esac
case "$password" in *[^[:alnum:]]*) has_other=1 ;; esac
나머지는 여전히 POSIX여야 합니다.
답변2
호출 grep
은 순차적으로 실행되며 스크립트의 마지막 호출 $?
과만 동일합니다 . grep
각 작업 후에 다음과 같은 것을 사용하고 싶을 것입니다 grep
.
retCodes=0
echo "$password" | grep -q "[A-Z]"
retCodes=$(($retCodes + $?))
echo "$password" | grep -q "[a-z]"
retCodes=$(($retCodes + $?))
echo "$password" | grep -q "[0-9]"
retCodes=$(($retCodes + $?))
이것if [[ $retCodes -eq 0 ]]; then ...
답변3
아마도 이것이 도움이 될 것입니다:
#!/bin/sh
echo "enter the password"
read -r password
caps="$(echo "$password" | sed 's/[^A-Z]//g')"
lowers="$(echo "$password" | sed 's/[^a-z]//g')"
numbers="$(echo "$password" | sed 's/[^0-9]//g')"
if [ "${#password}" -lt 8 ]; then
echo "password lenght should be greater than or equal 8"
else
echo "caps=${#caps} lowers=${#lowers} numbers=${#numbers}"
if [ "${#caps}" -ge 1 ] && [ "${#lowers}" -ge 1 ] && [ "${#numbers}" -ge 1 ]; then
echo "Strong password"
else
echo "Weak password"
fi
fi