리눅스에서 이상한 if 문 동작


2

나는 쉘 스크립트를 작성하고 이상한 행동을 보았습니다.

내 질문은 간단합니다. 왜 [[ "╝" = [█] ]]true로 평가됩니까? 둘 다 드문 ASCII 문자이기 때문입니까? 내 Mac에서는 잘 평가됩니다.

참고 : █은 괄호 안에 있어야합니다.


1
버그 인 것 같습니다.
choroba

버그 보고서를 제출하는 것이 좋습니다.
4ae1e1

답변:


2

평가는 플랫폼 (mac 또는 기타)에 의존하지 않습니다. 현재 로케일 설정에 따라 다릅니다.

$ LANG=C
$ if [[ "╝" = [█] ]]; then echo y; else echo n; fi
n
$ LANG=en_US.UTF-8
$ if [[ "╝" = [█] ]]; then echo y; else echo n; fi
y

간단한 스크립트를 통해 어떤 로케일이 표현식과 일치하는지 감지 할 수 있습니다.

for i in $(locale -a)
do
   export LANG=$i
   echo -n "LANG=$LANG   "
   if [[ "╝" = [█] ]]; then echo yes; else echo no; fi
done

UTF-8 로케일이 표현식과 일치하는지 확인하십시오. 로케일이 UTF-8 가능으로 설정되면 bash는 UTF-8 문자를 다른 방식으로 해석하므로 결과가 다른 이유입니다.

그럼에도 불구하고 UTF-8을 지원하는 로케일이 설정된 경우에도 false를 반환해야하기 때문에 버그라고 생각합니다.


버그입니다. 플랫폼과 버전에 따라 다릅니다. 나는 시스템의 bash 중 하나와 OS X에 bash는 4.3.30 내 우분투 14.04LTS에이 문제를 재현 할 수는 없지만 (3.2.57 (1), 다시 2007) 또는 양조 배쉬 (4.3.33 (1)) bash -c 'LANG=en_US.UTF-8; [[ "╝" = [█] ]]'또는 bash -c 'LANG=C; [[ "╝" = [█] ]]'모두 무엇이든 상관없이 1을 반환합니다.
4ae1e1

또한 인코딩 에서이 버그를 비난했지만 실패했습니다. UTF-8 문자를 모두 바이트로 분해하더라도 첫 번째 문자열은 두 번째 문자열과 일치하지 않습니다 ( []패턴으로 간주 ). 어쩌면 소스 코드를보고 정확히 무엇이 잘못되었는지 알아야 할 수도 있습니다.
4ae1e1

버그 보고서를 제출했지만 스크립팅이 아닌 언어에 대한 경험이 매우 제한적이므로 소스에서 문제를 찾는 데 큰 도움이되지 않을까 걱정됩니다.
Lattis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.