if 조건에서 대소문자를 구분하지 않는 패턴 일치

if 조건에서 대소문자를 구분하지 않는 패턴 일치

파일에는 두 가지 상황이 있을 수 있습니다 a.txt.

사례 1:

V1=last  #case insensitive
V2=Last  #case insensitive

사례 2:

V1=last     #case insensitive
V2=LastNum  #case insensitive

주어진 시간 V1에 둘 다 다른지 확인해야합니다 . 그리고 어떤 번호도 할당할 수 있습니다.V2V1V2

아래 코드를 사용하고 있지만 두 번째 경우인 when V1=last및 에서는 실패합니다 V2=LastNum. 사례 2의 예상 출력은 다음과 같습니다 Not Same.

if [[ ( "${V1}" =~ [Ll][Aa][Ss][Tt] && "${V2}" =~ [Ll][Aa][Ss][Tt]$ ) || ( "${V1}" == "${V2}" ) ]];then
  echo "V1 and V2 are same"
else
  echo "Not Same"
fi

어떤 도움이라도 환영합니다! 미리 감사드립니다!

답변1

Bash를 사용하는 경우 확장을 사용하여 소문자 ${var,,}$var만들 수 있습니다.

V1=foO V2=Foo
if [[ "${V1,,}" == "${V2,,}" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same in lowercase";
fi

또는 다음을 사용하십시오 nocasematch.

shopt -s nocasematch
V1=foO V2=Foo
if [[ "$V1" == "$V2" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same apart from case" ;
fi

이것이 ASCII 문자 이외의 문자에도 작동하는지 확실하지 않습니다. 일반적으로 대문자/소문자 비교 및 ​​대소문자를 구분하지 않는 일치 문제는 약간 까다로우며 로케일에 따라 다릅니다(터키어).조금씩 그리고 조금씩 나일반적인 예입니다.) 그러나 가지고 있는 것이 발음 구별 부호 없이 A부터 Z까지의 문자와 영어 호환 로케일 또는 set 뿐이라면 LC_ALL=C작동할 것입니다.


Zsh에서는 extendedglob이 옵션을 활성화하면 (#i)$V2오른쪽에서 다음을 사용할 수 있습니다.

setopt extendedglob
V1=foO V2=Foo
if [[ "$V1" == (#i)"$V2" ]]; then
    printf '%s\n' "'$V1' and '$V2' are the same apart from case" ;
fi

관련 정보