Сравнение строк без учета регистра в сценарии оболочки

string shell compare case-insensitive

165578 просмотра

11 ответа

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

Автор: Sachin Chourasiya Источник Размещён: 12.11.2019 09:11

Ответы (11)


65 плюса

Решение

если у вас есть Баш

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"
  }
}'
Автор: ghostdog74 Размещён: 13.11.2009 12:02

135 плюса

В Bash вы можете использовать раскрытие параметров, чтобы изменить строку для всех строчных и прописных букв:

var1=TesT
var2=tEst

echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
Автор: alphaniner Размещён: 16.10.2013 07:20

99 плюса

Все эти ответы игнорируют самый простой и быстрый способ сделать это (если у вас есть Bash 4):

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

Все, что вы делаете - конвертируете обе строки в строчные и сравниваете результаты.

Автор: Riot Размещён: 28.12.2014 07:13

33 плюса

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

shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u nocasematch
Автор: Gerry Hickman Размещён: 03.01.2013 11:45

13 плюса

Один из способов - преобразовать обе строки в верхнюю или нижнюю:

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
Автор: Randy Proctor Размещён: 13.11.2009 11:52

7 плюса

Для оболочки korn я использую встроенную команду typeset (-l для строчных букв и -u для прописных).

var=True
typeset -l var
if [[ $var == "true" ]]; then
    print "match"
fi
Автор: Ek C. Размещён: 26.09.2013 10:17

5 плюса

Очень просто, если вы воспользуетесь fgrep, чтобы сделать строку без учета регистра:

str1="MATCH"
str2="match"

if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
    echo "case-insensitive match";
fi
Автор: Cooper F. Nelson Размещён: 31.05.2016 06:46

3 плюса

Вот мое решение с использованием 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
Автор: stones333 Размещён: 09.05.2016 07:01

3 плюса

grepимеет -iфлаг, который означает, что регистр не учитывается, поэтому попросите его сообщить вам, находится ли var2 в var1.

var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
    echo "MATCH"
fi
Автор: Larry Размещён: 27.04.2010 08:00

1 плюс

shopt -s нокасеглоб

Автор: ennuikiller Размещён: 13.11.2009 11:38

1 плюс

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

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

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

Больше примеров для изменения регистра ниже:

> xx=Test
> echo $xx:u
TEST
> echo $xx:l
test
Автор: smac89 Размещён: 18.07.2018 12:31
Вопросы из категории :
32x32