O ==
operador é usado para comparar duas strings no shell script. No entanto, quero comparar duas strings ignorando maiúsculas e minúsculas, como isso pode ser feito? Existe algum comando padrão para isso?
string
shell
compare
case-insensitive
Sachin Chourasiya
fonte
fonte
if
instruções, ashopt
abordagem exige que você use o formato de parênteses duplos em[[ ]]
vez do[ ]
formulário entre parênteses . Veja também: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html==
é usada para comparar duas cadeias, mas a resposta demonstra uma comparação sem distinção entre maiúsculas e minúsculas usando umacase
instrução Reasseguradamente, ashopt
solução também permite o uso de maiúsculas e minúsculas de==
,=~
e outros operadores de comparação de cadeia.shopt -u nocasematch
após a comparação, a fim de voltar ao padrão do bash.nocasematch
configuração. Agarre-o com, emSHELLNOCASEMATCH=`shopt -p nocasematch`
seguida, altere-oshopt -s nocasematch
e, uma vez feito, restaure-o com #$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
porqueshopt -p
sairá com o código 1 se a opção não estiver configurada e isso pode causar o cancelamento do script seset -e
estiver em vigor.No Bash, você pode usar a expansão de parâmetros para modificar uma string para todas as letras maiúsculas / minúsculas:
fonte
echo
instrução resulta em:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
é implementado, mas geralmente essas soluções no "idioma" lidam com isso corretamente.Todas essas respostas ignoram a maneira mais fácil e rápida de fazer isso (desde que você tenha o Bash 4):
Tudo o que você está fazendo lá é converter as duas strings em minúsculas e comparar os resultados.
fonte
Salve o estado de nocasematch (caso alguma outra função dependa de sua desativação):
Nota: use apenas
local
se estiver dentro de uma função.fonte
case
declarações (incluindo as da resposta do ghostdog) sempre fazem minha pele arrepiarUma maneira seria converter as duas strings para superior ou inferior:
Outra maneira seria usar o grep:
fonte
tr
método em meus aplicativos com docker iz baseados em alpine (que fornecesh
viabusybox
). Obrigado.Para o korn shell, eu uso o comando interno typeset (-l para letras minúsculas e -u para letras maiúsculas).
fonte
Muito fácil se você fgrep fazer uma linha que não diferencia maiúsculas de minúsculas:
fonte
if fgrep -qix -- "$str1" <<<"$str2"; then
lugar.Aqui está a minha solução usando tr:
fonte
grep
possui uma-i
flag que significa que não diferencia maiúsculas de minúsculas, então peça para informar se var2 está em var1.fonte
Para
zsh
a sintaxe é um pouco diferente, mas ainda menor do que a maioria das respostas aqui:Isso converterá as duas strings em maiúsculas antes da comparação.
Outro método utiliza zsh's
globbing flags
, o que nos permite usar diretamente a correspondência que não diferencia maiúsculas de minúsculas usando oi
sinalizador glob:fonte
shopt -s nocaseglob
fonte
Me deparei com este ótimo blog / tutorial / o que quer que seja sobre como lidar com padrões que diferenciam maiúsculas de minúsculas . Os três métodos a seguir são explicados em detalhes com exemplos:
1. Converta padrão em minúscula usando o comando tr
2. Use regex com padrões de caso
3. Ative o nocasematch
fonte