쉘 스크립팅의 대소 문자 구분


10

이 Bash 스크립트를 고려하십시오.

#!/bin/bash
echo Enter any character
read char
case $char in
    [a-z]) echo Lower case letter
            ;;
    [A-Z]) echo Upper case letter
            ;;
    [0-9]) echo Number
            ;;
    ?) echo Special char
            ;;
    *) echo You entered more than one character 
            ;;
esac

'a'를 입력하면 출력은 소문자 이며 'A'와 동일합니다. 어떻게 극복합니까?


스크립트를 게시 할 때는 공백을 유지하기 위해 코드 형식을 사용해야합니다. 또한 실제 질문은 무엇입니까? 무슨 말인지 잘 모르겠습니다 ...
AJefferiss

2
@Arronical 필요 없음, echo는 예약어를 처리 할 수 ​​있습니다 echo if case then do.
terdon

비슷한 문제이지만 정렬을 다루는 경우 askubuntu.com/questions/597924/…
Joe

답변:


20
#!/bin/bash
echo 'enter any character'
read char
case $char in
[[:lower:]]) echo 'lower case letter'
    ;;
[[:upper:]]) echo 'upper case letter'
    ;;
[0-9]) echo 'number'
    ;;
?) echo 'special char'
    ;;
*) echo 'u entered more than one char' 
    ;;
esac  

bash에서 [az] 의 소문자 정규식과 [AZ] 의 대문자 정규식 에 대한 자세한 내용은 대소 문자 가 일치하지 않을 때 왜 case 문이 대소 문자를 구분하지 않습니까?를 참조하십시오. .


6
이것부터 다음을 대신 [0-9]사용할 수 있습니다 [[:digit:]]. man grepGoogle posix 문자 클래스 에서 더 많은 예제를 찾을 수 있습니다 .
Paddy Landau

21

문제는 문자 범위에 [a-z]실제로 대문자가 포함 된다는 것 입니다. 이것은 bash 매뉴얼에 설명되어 있습니다 :

대괄호 표현식 내에서 범위 표현식은 하이픈으로 구분 된 두 문자로 구성됩니다. 두 문자를 포함하여 단일 문자와 일치합니다. 기본 C 로케일에서 정렬 순서는 기본 문자 순서입니다. 예를 들어 '[ad]'는 '[abcd]'와 같습니다. 다른 로케일에서 정렬 순서가 지정되지 않았으며 '[ad]'는 '[abcd]'또는 '[aBbCcDd]' 와 같거나 문자 또는 해당 문자 세트와 일치하지 않을 수 있습니다. 일치하지 않을 수도 있습니다. 대괄호 표현식의 일반적인 해석을 얻으려면 LC_ALL 환경 변수를 'C'값으로 설정하여 'C'로케일을 사용할 수 있습니다.

설명하기 위해 :

$ case B in [a-c]) echo YES;;  *) echo NO;; esac
YES
$ LC_ALL=C; case B in [a-c]) echo YES;; *) echo NO;; esac
NO

따라서 발생하는 로케일 (이 아닌 C) [a-c]은 실제로 [aAbBcC]입니다. 그렇기 때문에 @karel이 제안한 POSIX 문자 클래스 대신 사용해야합니다.


4
더 정확하게, 당신은 설정해야 LC_COLLATE하는 C다른 로케일 설정에 대한 그것의 확인이 다를 수 있습니다. LC_COLLATE아무 것도 설정 C하지 않지만 좋은 아이디어는 아니지만 슬프게도 우분투는 그렇게합니다 (지금까지 유일한 범인은 아닙니다).
Gilles 'SO- 악의
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.