
이것은 내가 작성한 코드입니다. 읽은 문자가 대문자, 소문자 또는 특수 기호인지 확인하려면 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
) . 일부 로케일 및 일부 도구에서는 문자 시퀀스와 일치할 수도 있습니다.z
bash
여기서는 아마도 다음을 원할 것입니다.
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로 수정하면 일부 문자를 문자 시퀀스로 잘못 해석할 수 있으므로 테스트가 유효하지 않게 됩니다. 예를 들어 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