Оператор == используется для сравнения двух строк в сценарии оболочки. Тем не менее, я хочу сравнить две строки без учета регистра, как это можно сделать? Есть ли стандартная команда для этого?
==
В Bash вы можете использовать расширение параметра, чтобы изменить строку для всех строчных и прописных букв:
var1=TesT var2=tEst echo ${var1,,} ${var2,,} echo ${var1^^} ${var2^^}
Все эти ответы игнорируют самый простой и быстрый способ сделать это (если у вас есть Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then echo ":)" fi
Все, что вы здесь делаете, это переводите обе строки в нижний регистр и сравниваете результаты.
если у вас есть 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" } }'
То же, что и ответ от 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 я использую встроенную команду 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
Вот мое решение с использованием 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.
grep
-i
var1=match var2=MATCH if echo $var1 | grep -i "^${var2}$" > /dev/null ; then echo "MATCH" fi
Для zsh синтаксис немного отличается:
zsh
> str1='MATCH' > str2='match' > [ "$str1" == "$str2:u" ] && echo 'Match!' Match! >
Это преобразует str2 в верхний регистр до сравнения.
str2
Ниже приведены дополнительные примеры изменения регистра:
> xx=Test > echo $xx:u TEST > echo $xx:l test