쉘 스크립트 - 단일 문자 입력이 대문자인지 소문자인지 또는 특수 문자인지 확인합니다.

쉘 스크립트 - 단일 문자 입력이 대문자인지 소문자인지 또는 특수 문자인지 확인합니다.

이것은 내가 작성한 코드입니다. 읽은 문자가 대문자, 소문자 또는 특수 기호인지 확인하려면 if elif를 사용하는 간단한 코드가 필요합니다.

echo "enter a char"
read c

if [[ $c == [A-Z] ]];
then
    echo "upper"
elif [[ $c == [a-z] ]];
then
    echo "lower"
else 
    echo "Digit or special symbols!"
fi

다음은 문자를 입력한 후 받은 출력입니다.

enter a char
A
upper

enter a char
a
Digit or special symbols!

aravind@bionic-beaver:~/Desktop$ ./1.sh
enter a char
1
Digit or special symbols!

답변1

비워 $IFS두고 옵션을 추가하지 않는 이상 -r,read매우 특별한 방법으로 입력 줄을 읽습니다..

예를 들어, 사용자가 를 입력하면 " \x "기본값은 에 사용자가 입력한 내용이 아닌 가 $IFS포함 $c됩니다 .x

또한 [a-z]소문자와 일치하지 않으며 로케일 사이의 모든 정렬과 일치합니다(셸 간의 동작에 약간의 차이가 있습니다. 예를 들어 많은 로케일에서 A와 Y 사이의 영어 문자를 포함하는 with a) . 일부 로케일 및 일부 도구에서는 문자 시퀀스와 일치할 수도 있습니다.zbash

여기서는 아마도 다음을 원할 것입니다.

printf >&2 'Please enter a character: '
IFS= read -r c
case $c in
  ([[:lower:]]) echo lowercase letter;;
  ([[:upper:]]) echo uppercase letter;;
  ([[:alpha:]]) echo neither lower nor uppercase letter;;
  ([[:digit:]]) echo decimal digit;;
  (?) echo any other single character;;
  ("") echo nothing;;
  (*) echo anything else;;
esac

(해당 구문은 POSIX sh구문이므로 설치할 필요도 없습니다 bash).

영어 문자(분음 부호가 없는 라틴어 문자)로 제한하려면 개별적으로 이름을 지정해야 합니다.

([abcdefghijklmnopqrstuvwxyz]) echo English lowercase letter;;

또는 명령문 export LC_ALL=Cread와 앞에 로케일을 C로 수정하면 일부 문자를 문자 시퀀스로 잘못 해석할 수 있으므로 테스트가 유효하지 않게 됩니다. 예를 들어 UTF-8은 C 로케일에서 두 문자로 표시됩니다.case(?)é

답변2

정규식 테스트를 사용해 보세요.

read -p "Type a character" c
if [[ "$c" =~ [a-z] ]]; then
    echo "lowercase"
elif [[ "$c" =~ [A-Z] ]]; then
    echo "uppercase"
else
    echo "Non-alphabetic"
fi

답변3

변수를 따옴표로 묶어야 합니다. 예를 들어 정규식을 문자열로 테스트하는 경우 다음을 입력할 수 있습니다.

echo "enter a US state name"
read var_1

if [[ "$var_1" =~ [A-Z] ]]; then
    echo "contains a capital letter"
elif [[ "$var_1" =~ [a-z] ]]; then
    echo "contains lower case letters"
else
    echo "contains special characters or numbers"
fi
    

답변4

while read -r line; do
    [[ "${line:0:1}" =~ [[:upper:]] ]] && echo "Started with upper: $line" || echo "$line";
done</path/to/file

관련 정보