Comparación que no distingue entre mayúsculas y minúsculas de cadenas en un script de shell

Resuelto Sachin asked hace 14 años • 14 respuestas

El ==operador se utiliza para comparar dos cadenas en un script de shell. Sin embargo, quiero comparar dos cadenas ignorando mayúsculas y minúsculas, ¿cómo se puede hacer? ¿Existe algún comando estándar para esto?

Sachin avatar Nov 13 '09 18:11 Sachin
Aceptado

En Bash, puede usar la expansión de parámetros para modificar una cadena a minúsculas/mayúsculas: ${var,,}para minúsculas, ${var^^}para mayúsculas.

var1=TesT
var2=tEst

echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
alphaniner avatar Oct 16 '2013 19:10 alphaniner

Todas estas respuestas ignoran la forma más fácil y rápida de hacer esto (siempre que tengas Bash 4):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo ":)"
fi

Todo lo que estás haciendo allí es convertir ambas cadenas a minúsculas y comparar los resultados.

Riot avatar Dec 28 '2014 19:12 Riot

si tienes bash

str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
 $str2 ) echo "match";;
 *) echo "no match";;
esac

de lo contrario, deberías decirnos qué shell estás utilizando.

alternativa, usando awk

str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
  if ( tolower(s1) == tolower(s2) ){
    print "match"
  }
}'
ghostdog74 avatar Nov 13 '2009 12:11 ghostdog74

Guarde el estado de nocasematch(en caso de que alguna otra función dependa de que esté deshabilitada):

local orig_nocasematch=$(shopt -p nocasematch; true)
shopt -s nocasematch

[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"

$orig_nocasematch

Tenga en cuenta que localsolo se requiere dentro de una función.
Además, la ; trueparte evitará que el shell salga cuando set -eesté activado y $(shopt -p nocasematch)falle (porque nocasematch NO se configuró en absoluto).

Gerry Hickman avatar Jan 03 '2013 11:01 Gerry Hickman