Без учета регистра сравнение строк в shell-скрипт


на == оператор используется для сравнения двух строк в shell-скрипт. Однако я хочу сравнить две строки, игнорируя случай, как это можно сделать? Есть ли стандартная команда для этого?

11 82

11 ответов:

Если у вас есть bash

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

все, что вы делаете есть преобразование строки в нижний регистр и сравнить результаты.

то же, что и ответ от ghostdog74, но немного другой код

shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u 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

для оболочки korn я использую встроенную команду набора текста (- 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
var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
  echo "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

shopt-s nocaseglob

на zsh синтаксис немного отличается:

> str1='MATCH'
> str2='match'
> [ "$str1" == "$str2:u" ] && echo 'Match!'
Match!
>

это преобразует str2 в верхний регистр перед сравнением.

больше примеров для изменения случае ниже:

> xx=Test
> echo $xx:u
TEST
> echo $xx:l
test