Оператор ==
используется для сравнения двух строк в оболочке script. Тем не менее, я хочу сравнить две строки, игнорируя случай, как это можно сделать? Есть ли для этого стандартная команда?
Нечувствительное к регистру сравнение строк в оболочке script
Ответ 1
если у вас есть 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"
}
}'
Ответ 2
В Bash вы можете использовать расширение параметра, чтобы изменить строку на весь нижний/верхний регистр:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
Ответ 3
Все эти ответы игнорируют самый простой и быстрый способ сделать это (если у вас есть Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Все, что вы делаете, преобразует обе строки в нижний регистр и сравнивает результаты.
Ответ 4
То же, что и ответ от ghostdog74, но немного другой код
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u nocasematch
Ответ 5
Одним из способов было бы преобразовать обе строки в верхнюю или нижнюю:
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
Ответ 6
Для оболочки korn я использую встроенную команду набора (-l для нижнего регистра и -u для верхнего регистра).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Ответ 7
Очень легко, если вы сделаете frrep для сравнения без учета регистра:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
Ответ 8
grep
есть флаг -i
который означает, что регистр не -i
поэтому попросите его сообщить вам, находится ли var2 в var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Ответ 9
Вот мое решение, использующее 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
Ответ 10
shopt -s nocaseglob
Ответ 11
Для zsh
синтаксис несколько отличается:
> str1='MATCH'
> str2='match'
> [ "$str1" == "$str2:u" ] && echo 'Match!'
Match!
>
Это приведет к преобразованию str2
в верхний регистр перед сравнением.
Дополнительные примеры для изменения ниже:
> xx=Test
> echo $xx:u
TEST
> echo $xx:l
test