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