programing

대소문자를 구분하지 않는 셸 스크립트의 문자열 비교

jooyons 2023. 7. 29. 08:24
반응형

대소문자를 구분하지 않는 셸 스크립트의 문자열 비교

==연산자는 셸 스크립트에서 두 문자열을 비교하는 데 사용됩니다.그런데 케이스를 무시한 두 문자열을 비교하고 싶은데 어떻게 해야 하나요?이것에 대한 표준 명령어가 있습니까?

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

var1=TesT
var2=tEst

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

다음과 같은 답변은 모두 이를 위한 가장 쉽고 빠른 방법을 무시합니다(Bash 4가 있는 경우).

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

거기서 하는 일은 두 문자열을 모두 소문자로 변환하고 결과를 비교하는 것뿐입니다.

기회가 된다면,

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"
  }
}'

상태 저장nocasematch(비활성화 여부에 따라 다른 기능이 달라지는 경우):

local orig_nocasematch=$(shopt -p nocasematch; true)
shopt -s nocasematch

[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"

$orig_nocasematch

참고:local는 함수 내부에서만 필요합니다.
그리고 또.; true부품은 다음과 같은 경우 셸이 나가는 것을 방지합니다.set -e설정되어 있습니다.$(shopt -p nocasematch)(대소문자 일치가 전혀 설정되지 않았기 때문에) 실패합니다.

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

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

대소문자를 구분하는 패턴을 다루는 훌륭한 블로그/자습서/무엇이든 알게 되었습니다.다음 세 가지 방법이 예제와 함께 자세히 설명되어 있습니다.

tr 명령을 사용하여 패턴을 소문자로 변환

opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
        sql)
                echo "Running mysql backup using mysqldump tool..."
                ;;
        sync)
                echo "Running backup using rsync tool..."
                ;;
        tar)
                echo "Running tape backup using tar tool..."
                ;;
        *)
                echo "Other options"
                ;;
esac

케이스 패턴이 있는 조심스러운 글러브 사용

opt=$1
case $opt in
        [Ss][Qq][Ll])
                echo "Running mysql backup using mysqldump tool..."
                ;;
        [Ss][Yy][Nn][Cc])
                echo "Running backup using rsync tool..."
                ;;
        [Tt][Aa][Rr])
                echo "Running tape backup using tar tool..."
                ;;
        *)
                echo "Other option"
                ;;
esac

대소문자 일치 설정

opt=$1
shopt -s nocasematch
case $opt in
        sql)
                echo "Running mysql backup using mysqldump tool..."
                ;;
        sync)
                echo "Running backup using rsync tool..."
                ;;
        tar)
                echo "Running tape backup using tar tool..."
                ;;
        *)
                echo "Other option"
                ;;
esac

shopt -u nocasematch

위해서zsh구문은 약간 다르지만 여전히 대부분의 답변보다 짧습니다.

> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>

비교하기 전에 두 문자열을 모두 대문자로 변환합니다.


다른 방법은 zsh's를 사용하는데, 이를 통해 대소문자를 구분하지 않는 매칭을 직접 사용할 수 있습니다.i글로벌 플래그:

setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"

# this example compares the variable with a literal string 'match'
[[ $str1 = (#i)match ]] && echo "Match success"

korn 쉘의 경우 typet built-in 명령어( 소문자는 l, 대문자는 -u)를 사용합니다.

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

대소문자를 구분하지 않는 줄 비교를 수행하려면 매우 쉽습니다.

str1="MATCH"
str2="match"

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

tr을 사용한 제 솔루션은 다음과 같습니다.

var1=match
var2=MATCH
var1=`echo $var1 | tr '[A-Z]' '[a-z]'`
var2=`echo $var2 | tr '[A-Z]' '[a-z]'`
if [ "$var1" = "$var2" ] ; then
  echo "MATCH"
fi

grep을 가지고 있습니다.-i대소문자를 구분하지 않음을 의미하는 플래그이므로 var2가 var1에 있는지 알려달라고 요청합니다.

var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
    echo "MATCH"
fi

쇼핑백이 든 가방

'tr' 유틸리티(번역 문자)는 모든 Unix/Linux 컴퓨터에 항상 있으며 경량입니다.

대소문자를 구분하지 않는 비교를 처리하는 데 사용할 수 있는 기능이 있습니다.'tr'의 정확한 위치는 다양할 수 있으므로 먼저 가능한 위치를 조사하고 "BIN_TR"이라는 이름의 환경에 정확한 위치를 저장합니다.

declare BIN_TR=$( ls /bin/tr /usr/bin/tr 2>/dev/null | head -1 );

그런 다음 함수 선언에 사용됩니다.

toLowerCase() {
  echo "$*" | $BIN_TR '[:upper:]' '[:lower:]'
}

'tr'을 사용하는 솔루션은 다양한 OS와 OS 설정 간에 이동성이 높을 것으로 예상됩니다.'awk'도 가능성이 높지만 'tr' 유틸리티는 'awk'에 비해 작기 때문에 'tr'을 사용하는 함수는 무게가 더 가볍습니다.

유닉스 계열 운영 체제에서 test 명령은 파일 형식을 확인하고 값을 비교합니다.

str1="MATCH"
str2="match"

if test $str1 =  $str2
  then
  echo "equal yes"
else
  echo "equal not"
fi

유닉스 계열 운영 체제에서 test 명령은 파일 형식을 확인하고 값을 비교합니다.

그렇게 하면 아주 간단합니다.

두세 줄의 암호로

언급URL : https://stackoverflow.com/questions/1728683/case-insensitive-comparison-of-strings-in-shell-script

반응형