El ==
operador se utiliza para comparar dos cadenas en el script de shell. Sin embargo, quiero comparar dos cadenas ignorando mayúsculas y minúsculas, ¿cómo se puede hacer? ¿Hay algún comando estándar para esto?
El ==
operador se utiliza para comparar dos cadenas en el script de shell. Sin embargo, quiero comparar dos cadenas ignorando mayúsculas y minúsculas, ¿cómo se puede hacer? ¿Hay algún comando estándar para esto?
Respuestas:
si tienes bash
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
de lo contrario, debe decirnos qué shell está utilizando.
alternativa, usando awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
==
se usa para comparar dos cadenas, pero la respuesta demuestra una comparación que no distingue entre mayúsculas y minúsculas mediante una case
instrucción. De modo tranquilizador, la shopt
solución también permite el uso de mayúsculas y minúsculas de ==
, =~
y otros operadores de comparación de cadenas.
shopt -u nocasematch
después de que se realice la comparación para volver al valor predeterminado de bash.
nocasematch
configuración. Agárralo y SHELLNOCASEMATCH=`shopt -p nocasematch`
luego shopt -s nocasematch
$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)
porque shopt -p
saldrá con el código 1 si la opción no está configurada, y esto puede hacer que el script se cancele si set -e
está vigente.
En Bash, puede usar la expansión de parámetros para modificar una cadena en minúsculas / mayúsculas:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
echo
declaración da como resultado:-bash: ${var1,,}: bad substitution
shopt -s nocasematch
se implementa, pero por lo general, estas soluciones de "nivel de lenguaje" lo manejan correctamente.
Todas estas respuestas ignoran la forma más fácil y rápida de hacer esto (siempre que tenga Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Todo lo que está haciendo allí es convertir ambas cadenas a minúsculas y comparar los resultados.
Guarde el estado de nocasematch (en caso de que alguna otra función dependa de que esté deshabilitada):
local orig_nocasematch=$(shopt -p nocasematch)
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
$orig_nocasematch
Nota: solo use local
si está dentro de una función.
case
declaraciones (incluidas las de la respuesta de ghostdog) siempre harán que mi piel se
Una forma sería convertir ambas cadenas en superior o inferior:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Otra forma sería usar grep:
echo "string" | grep -qi '^String$' && echo same || echo different
tr
método en mis aplicaciones Docker-Iized basadas en Alpine (que proporciona a sh
través de busybox
). Gracias.
Para korn shell, uso el comando integrado typeset (-l para minúsculas y -u para mayúsculas).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Muy fácil si fgrep para hacer una línea que distingue entre mayúsculas y minúsculas compare:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
Aquí está mi solución usando tr:
var1=match
var2=MATCH
var1=`echo $var1 | tr '[A-Z]' '[a-z]'`
var2=`echo $var2 | tr '[A-Z]' '[a-z]'`
if [ "$var1" = "$var2" ] ; then
echo "MATCH"
fi
grep
tiene una -i
bandera que significa que no distingue entre mayúsculas y minúsculas, así que pídele que te diga si var2 está en var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Para zsh
la sintaxis es un poco diferente, pero sigue siendo más corta que la mayoría de las respuestas aquí:
> str1='mAtCh'
> str2='MaTcH'
> [[ "$str1:u" = "$str2:u" ]] && echo 'Strings Match!'
Strings Match!
>
Esto convertirá ambas cadenas a mayúsculas antes de la comparación.
Otro método hace uso de zsh's globbing flags
, que nos permite hacer uso directo de la coincidencia entre mayúsculas y minúsculas mediante el uso de la i
bandera global:
setopt extendedglob
[[ $str1 = (#i)$str2 ]] && echo "Match success"
[[ $str1 = (#i)match ]] && echo "Match success"
shopt -s nocaseglob
Me encontré con este gran blog / tutorial / lo que sea sobre tratar con un patrón sensible a mayúsculas y minúsculas . Los siguientes tres métodos se explican en detalle con ejemplos:
1. Convertir el patrón a minúsculas usando el 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 expresiones regulares con patrones de casos
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. Encienda 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
declaraciones, elshopt
enfoque requiere que use la forma de doble[[ ]]
condicional de condicional en lugar de la forma de un solo corchete[ ]
. Ver también: gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html