==
Оператор используется для сравнения двух строк в скрипте оболочки. Однако я хочу сравнить две строки без учета регистра, как это можно сделать? Есть ли для этого какая-нибудь стандартная команда?
==
Оператор используется для сравнения двух строк в скрипте оболочки. Однако я хочу сравнить две строки без учета регистра, как это можно сделать? Есть ли для этого какая-нибудь стандартная команда?
Ответы:
если у вас есть 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"
}
}'
==
используется для сравнения двух строк, но ответ демонстрирует сравнение без учета регистра с использованием case
оператора. Обнадеживает, то shopt
решение также позволяет регистронезависимое использование ==
, =~
и другие операторы сравнения строк.
shopt -u nocasematch
после того, как сравнение будет выполнено, чтобы вернуться к значениям по умолчанию для bash.
nocasematch
настройку. Возьмите его с SHELLNOCASEMATCH=`shopt -p nocasematch`
затем изменить его shopt -s nocasematch
и когда - то сделали, восстановите его$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
потому что shopt -p
завершится с кодом 1, если параметр не установлен, и это может привести к прерыванию сценария, если set -e
он действует.
В Bash вы можете использовать расширение параметра, чтобы преобразовать строку в нижний / верхний регистр:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
оператор приводит к следующему:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
это реализовано, но обычно такие решения "языкового уровня" справляются с этим правильно.
Все эти ответы игнорируют самый простой и быстрый способ сделать это (если у вас есть Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Все, что вы там делаете, это преобразование обеих строк в нижний регистр и сравнение результатов.
Сохраните состояние nocasematch (если какая-то другая функция зависит от того, что она отключена):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Примечание: используйте только local
если он находится внутри функции.
case
заявления (в том числе в ответе ghostdog) всегда вызывают
Один из способов - преобразовать обе строки в верхнюю или нижнюю:
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
tr
метод в своих docker-ized приложениях на основе alpine (который предоставляет sh
через busybox
). Спасибо.
Для оболочки 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
grep
имеет -i
флаг, который означает нечувствительность к регистру, поэтому попросите его сообщить вам, находится ли var2 в var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Поскольку zsh
синтаксис немного отличается, но все же короче, чем большинство ответов здесь:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Это преобразует обе строки в верхний регистр перед сравнением.
Другой метод использует zsh globbing flags
, что позволяет нам напрямую использовать сопоставление без учета регистра с помощью i
флага glob:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
Я наткнулся на этот отличный блог / учебник / что угодно о работе с шаблоном, чувствительным к регистру . Следующие три метода подробно объясняются с примерами:
1. Преобразуйте узор в нижний регистр с помощью команды tr.
opt=$( tr '[:upper:]' '[:lower:]' <<<"$1" )
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other options"
;;
esac
2. Будьте осторожны с шаблонами корпусов.
opt=$1
case $opt in
[Ss][Qq][Ll])
echo "Running mysql backup using mysqldump tool..."
;;
[Ss][Yy][Nn][Cc])
echo "Running backup using rsync tool..."
;;
[Tt][Aa][Rr])
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
3. Включите nocasematch.
opt=$1
shopt -s nocasematch
case $opt in
sql)
echo "Running mysql backup using mysqldump tool..."
;;
sync)
echo "Running backup using rsync tool..."
;;
tar)
echo "Running tape backup using tar tool..."
;;
*)
echo "Other option"
;;
esac
shopt -u nocasematch
if
операторов,shopt
подход требует, чтобы вы использовали[[ ]]
форму с двумя скобками условного выражения вместо формы с одной скобкой[ ]
. См. Также: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html