bash - 대소문자를 구분하지 않는 변수 일치

bash - 대소문자를 구분하지 않는 변수 일치

이 구문은 변수가 "no"일 때 "linux"를 인쇄합니다.

 [[ $LINUX_CONF = no ]] && echo "linux"

비교에서 대소문자를 구분하지 않으려면 정규식(또는 이와 유사한 것)을 어떻게 사용합니까?

답변1

표준형

ksh-style 명령 을 사용할 필요가 없습니다 . [[...]]여기에서 표준 sh case구성을 사용할 수 있습니다.

case $LINUX_CONF in
  ([Nn][Oo]) echo linux;;
  (*)        echo not linux;;
esac

또는 가능한 각 사례의 이름을 개별적으로 지정합니다.

case $LINUX_CONF in
  (No | nO | NO | no) echo linux;;
  (*)                 echo not linux;;
esac

세게 때리다

bash대소문자를 구분하지 않는 일치를 수행하는 특정 방법 으로 다음을 수행할 수 있습니다.

shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux

또는:

[[ ${LINUX_CONF,,} = no ]] && echo linux

( ${VAR,,}문자열을 소문자로 변환하는 구문은 어디에 있습니까?)

다음을 할당할 때 변수를 강제로 소문자로 만들 수도 있습니다.

typeset -l LINUX_CONF

이는 ksh에서도 제공되며 및 에서도 bash지원 됩니다 zsh.

다른 쉘에 대한 추가 변형:

다루기 힘든

set -o nocasematch
[[ $LINUX_CONF = no ]] && echo linux

( 와 동일 bash).

set -o extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux

(만드는 것보다 덜 위험하다모두일치는 대소문자를 구분하지 않습니다)

[[ ${(L)LINUX_CONF} = no ]] && echo linux
[[ $LINUX_CONF:l = no ]] && echo linux

(소문자 연산자로 변환)

set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)no\z' ]]

(PCRE 구문)

크쉬 93

[[ $LINUX_CONF = ~(i)no ]]

또는

[[ $LINUX_CONF = ~(i:no) ]]

대소문자를 구분하지 않는 일치를 제외 하고 [nN][oO]위의 모든 방법은 사용자의 로케일에 따라 다릅니다. 전 세계의 모든 사람이 특정 문자의 대문자 버전이 무엇인지에 동의하는 것은 아닙니다. 심지어 ASCII 문자의 경우에도 마찬가지입니다.

실제로 ASCII에서는 적어도 GNU 시스템에서는 영어 규칙과의 편차는 앰퍼샌드와 점이 대문자 또는 소문자 버전으로 존재하는지 i여부 로 제한되는 것 같습니다.I

즉, [[ ${VAR,,} = oui ]]모든 로케일에서 일치가 보장되지는 않습니다 OUI.현재 버전의 버그bash고정되어 있습니다.)

답변2

기존 명령을 유지하되 실행하기 전에 온라인으로 만드세요.

LINUX_CONF=$(echo $LINUX_CONF | awk '{ print tolower($0) }')

이렇게 하면 변수에 저장된 값의 대소문자에 관계없이 대체 값이 소문자로 강제됩니다. 이렇게 하면 기존 명령이 단 한 줄의 추가 코드와 일치하게 됩니다.

관련 정보