Comparação sem distinção entre maiúsculas e minúsculas de strings no shell script
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?
— Sachin Chourasiya
se você tiver festança
caso contrário, você deve nos dizer qual shell você está usando.
alternativa, usando awk
Para qualquer pessoa que compare cadeias de caracteres usando ifinstruções, a shoptabordagem 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
A pergunta indica que ==é usada para comparar duas cadeias, mas a resposta demonstra uma comparação sem distinção entre maiúsculas e minúsculas usando uma caseinstrução Reasseguradamente, a shoptsolução também permite o uso de maiúsculas e minúsculas de ==, =~e outros operadores de comparação de cadeia.
Provavelmente, é prudente executar shopt -u nocasematchapós a comparação, a fim de voltar ao padrão do bash.
Melhor salvar e restaurar a nocasematchconfiguração. Agarre-o com, em SHELLNOCASEMATCH=`shopt -p nocasematch`seguida, altere-o shopt -s nocasematche, uma vez feito, restaure-o com #$SHELLNOCASEMATCH
Melhor ainda:, SHELLNOCASEMATCH=$(shopt -p nocasematch; true)porque shopt -psairá com o código 1 se a opção não estiver configurada e isso pode causar o cancelamento do script se set -eestiver 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:
— alfaniner
Pelo menos uma resposta que não implica a opção de compra. Assim, você pode comparar o caso de duas cordas ignorando e, no mesmo teste, comparar outros dois com o caso. Obrigado
Isso é novo no Bash 4? Pelo menos no Bash 3.2.51 (usado no OS X 10.9), ele não funciona - a primeira echoinstrução resulta em:-bash: ${var1,,}: bad substitution
Tais implementações de comparação que não diferenciam maiúsculas de minúsculas são propensas a problemas de localização (como o problema do turco I). Não sei como shopt -s nocasematché implementado, mas geralmente essas soluções no "idioma" lidam com isso corretamente.
@Ohad Schneider, deixe a preocupação turcos sobre problemas de localização turca, eu só preciso de uma maneira rápida e eficiente para string jogo e isso leva o bolo pela margem huuuuuge
usuários do macOS, atualize sua versão do Bash. O seu está desatualizado há mais de uma década neste ponto. itnext.io/upgrading-bash-on-macos-7138bd1066ba
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.
Isso está disponível apenas no Bash 4 ou mais recente (por exemplo, não no Mac OS X 10.11)
— d4Rk 11/11/16
@ d4Rk, e é por isso que a primeira frase da minha resposta diz "contanto que você tenha o Bash 4". Dito isto, o Bash 4 está fora há mais de sete anos no momento em que escrevi este comentário, e minha própria instalação do OS X o mantém há quase tanto tempo.
@ Motim desculpe, não percebi isso em primeiro lugar. Eu sei que você pode instalar o bash que quiser no OS X, mas o padrão é 3.2 e como meu script deve ser executado em diferentes Macs também, essa não é realmente uma opção para mim.
@ d4Rk é compreensível - se você realmente precisa garantir a portabilidade, sugiro seguir o padrão de shell POSIX, pois não há garantia de encontrar nenhuma versão do bash em alguns casos.
Era exatamente isso que eu estava procurando. Devem ser mais acima =)
Salve o estado de nocasematch (caso alguma outra função dependa de sua desativação):
local orig_nocasematch=$(shopt -p nocasematch)
Nota: use apenas localse estiver dentro de uma função.
Bom porque casedeclarações (incluindo as da resposta do ghostdog) sempre fazem minha pele arrepiar
Uma maneira seria converter as duas strings para superior ou inferior:
Outra maneira seria usar o grep:
Eu usei o trmétodo em meus aplicativos com docker iz baseados em alpine (que fornece shvia busybox). Obrigado.
— MXWest 30/08/19
Para o korn shell, eu uso o comando interno typeset (-l para letras minúsculas e -u para letras maiúsculas).
— Ek C.
Isso é muito melhor em termos de desempenho do que iniciar o awk ou qualquer outro processo.
No bash, declare -l ou -u pode ser usado para definir os atributos.
Muito fácil se você fgrep fazer uma linha que não diferencia maiúsculas de minúsculas:
— Cooper F. Nelson
Seria melhor usar em seu if fgrep -qix -- "$str1" <<<"$str2"; thenlugar.
Aqui está a minha solução usando tr:
— stones333
greppossui uma -iflag que significa que não diferencia maiúsculas de minúsculas, então peça para informar se var2 está em var1.
não funcionará se houver caracteres especiais regex em var2.
Para zsha 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 o isinalizador glob:
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: