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 caseinstrucción. De modo tranquilizador, la shoptsolución también permite el uso de mayúsculas y minúsculas de ==, =~y otros operadores de comparación de cadenas.
shopt -u nocasematchdespués de que se realice la comparación para volver al valor predeterminado de bash.
nocasematchconfiguración. Agárralo y SHELLNOCASEMATCH=`shopt -p nocasematch`luego shopt -s nocasematch$SHELLNOCASEMATCH
SHELLNOCASEMATCH=$(shopt -p nocasematch; true)porque shopt -psaldrá con el código 1 si la opción no está configurada, y esto puede hacer que el script se cancele si set -eestá 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^^}
echodeclaración da como resultado:-bash: ${var1,,}: bad substitution
shopt -s nocasematchse 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 localsi está dentro de una función.
casedeclaraciones (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
trmétodo en mis aplicaciones Docker-Iized basadas en Alpine (que proporciona a shtravé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
greptiene una -ibandera 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 zshla 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 ibandera 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
ifdeclaraciones, elshoptenfoque 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