==
Оператор используется для сравнения двух строк в скрипте оболочки. Однако я хочу сравнить две строки без учета регистра, как это можно сделать? Есть ли для этого какая-нибудь стандартная команда?
string
shell
compare
case-insensitive
Сачин Чурасия
источник
источник
if
операторов,shopt
подход требует, чтобы вы использовали[[ ]]
форму с двумя скобками условного выражения вместо формы с одной скобкой[ ]
. См. Также: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html==
используется для сравнения двух строк, но ответ демонстрирует сравнение без учета регистра с использованием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 вы можете использовать расширение параметра, чтобы преобразовать строку в нижний / верхний регистр:
источник
echo
оператор приводит к следующему:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
это реализовано, но обычно такие решения "языкового уровня" справляются с этим правильно.Все эти ответы игнорируют самый простой и быстрый способ сделать это (если у вас есть Bash 4):
Все, что вы там делаете, это преобразование обеих строк в нижний регистр и сравнение результатов.
источник
Сохраните состояние nocasematch (если какая-то другая функция зависит от того, что она отключена):
Примечание: используйте только
local
если он находится внутри функции.источник
case
заявления (в том числе в ответе ghostdog) всегда вызываютОдин из способов - преобразовать обе строки в верхнюю или нижнюю:
Другой способ - использовать grep:
источник
tr
метод в своих docker-ized приложениях на основе alpine (который предоставляетsh
черезbusybox
). Спасибо.Для оболочки korn я использую встроенную команду набора (-l для нижнего регистра и -u для верхнего регистра).
источник
Очень просто, если вы выполните fgrep для сравнения строк без учета регистра:
источник
if fgrep -qix -- "$str1" <<<"$str2"; then
вместо него использовать .Вот мое решение с использованием tr:
источник
grep
имеет-i
флаг, который означает нечувствительность к регистру, поэтому попросите его сообщить вам, находится ли var2 в var1.источник
Поскольку
zsh
синтаксис немного отличается, но все же короче, чем большинство ответов здесь:Это преобразует обе строки в верхний регистр перед сравнением.
Другой метод использует zsh
globbing flags
, что позволяет нам напрямую использовать сопоставление без учета регистра с помощьюi
флага glob:источник
shopt -s nocaseglob
источник
Я наткнулся на этот отличный блог / учебник / что угодно о работе с шаблоном, чувствительным к регистру . Следующие три метода подробно объясняются с примерами:
1. Преобразуйте узор в нижний регистр с помощью команды tr.
2. Будьте осторожны с шаблонами корпусов.
3. Включите nocasematch.
источник