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?
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?
Respostas:
se você tiver festança
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
caso contrário, você deve nos dizer qual shell você está usando.
alternativa, usando awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
é usada para comparar duas cadeias, mas a resposta demonstra uma comparação sem distinção entre maiúsculas e minúsculas usando uma case
instrução Reasseguradamente, a shopt
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, em SHELLNOCASEMATCH=`shopt -p nocasematch`
seguida, altere-o shopt -s nocasematch
e, uma vez feito, restaure-o com #$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
porque shopt -p
sairá com o código 1 se a opção não estiver configurada e isso pode causar o cancelamento do script se set -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:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
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):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Tudo o que você está fazendo lá é converter as duas strings em minúsculas e comparar os resultados.
Salve o estado de nocasematch (caso alguma outra função dependa de sua desativação):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Nota: use apenas local
se estiver dentro de uma função.
case
declarações (incluindo as da resposta do ghostdog) sempre fazem minha pele arrepiar
Uma maneira seria converter as duas strings para superior ou inferior:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Outra maneira seria usar o grep:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
método em meus aplicativos com docker iz baseados em alpine (que fornece sh
via busybox
). Obrigado.
Para o korn shell, eu uso o comando interno typeset (-l para letras minúsculas e -u para letras maiúsculas).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Muito fácil se você fgrep fazer uma linha que não diferencia maiúsculas de minúsculas:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
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.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Para zsh
a sintaxe é um pouco diferente, mas ainda menor do que a maioria das respostas aqui:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
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 i
sinalizador glob:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
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
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. Use regex com padrões de caso
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. Ative o 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
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