[string] 쉘 스크립트에서 대소 문자를 구분하지 않는 문자열 비교

==연산자는 쉘 스크립트에서 두 문자열을 비교하는 데 사용됩니다. 그러나 대소 문자를 무시하고 두 문자열을 비교하고 싶습니다. 어떻게 수행 할 수 있습니까? 이에 대한 표준 명령이 있습니까?



답변

배쉬가 있다면

str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
 $str2 ) echo "match";;
 *) echo "no match";;
esac

그렇지 않으면 사용중인 쉘을 알려주십시오.

대안, awk 사용

str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
  if ( tolower(s1) == tolower(s2) ){
    print "match"
  }
}'


답변

Bash에서는 매개 변수 확장을 사용하여 문자열을 모두 소문자 / 대문자로 수정할 수 있습니다.

var1=TesT
var2=tEst

echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}


답변

이 모든 대답은 Bash 4가있는 한 가장 쉽고 빠른 방법을 무시합니다.

if [ "${var1,,}" = "${var2,,}" ]; then
  echo ":)"
fi

당신이하고있는 일은 두 문자열을 모두 소문자로 변환하고 결과를 비교하는 것입니다.


답변

nocasematch 상태를 저장하십시오 (다른 기능이 사용 불가능한 경우에 따라 다름).

local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch

참고 : local함수 안에있는 경우 에만 사용 하십시오.


답변

한 가지 방법은 두 문자열을 모두 위 또는 아래로 변환하는 것입니다.

test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different

다른 방법은 grep을 사용하는 것입니다.

echo "string" | grep -qi '^String$' && echo same || echo different


답변

korn 쉘의 경우 typeset 내장 명령을 사용합니다 (소문자는 -l, 대문자는 -u).

var=True
typeset -l var
if [[ $var == "true" ]]; then
    print "match"
fi


답변

대소 문자를 구분하지 않는 라인 비교를 fgrep하면 매우 쉽습니다.

str1="MATCH"
str2="match"

if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
    echo "case-insensitive match";
fi