제가 작성한 코드입니다. 읽은 문자가 대문자, 소문자 또는 특수 기호인지 확인하려면 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
내 및 로케일 사이의 모든 유형 과 일치합니다 z
(쉘 간의 동작에 약간의 차이가 있습니다. 예를 들어 bash
많은 로케일에서 여기에는 A와 Y 사이의 영어 문자가 포함됩니다). 특정 로케일과 특정 도구의 문자 시퀀스도 일치시킬 수 있습니다.
여기에서 다음을 수행할 수 있습니다.
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=C
또는 명령문 앞뒤에 read
로케일을 C로 수정 case
하지만 (?)
일부 문자를 문자 시퀀스로 잘못 해석할 수 있으므로 테스트가 작동하지 않습니다. 예를 들어 UTF-8은 é
C 로케일에서 두 문자로 처리됩니다.
답변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