Saltar al contenido

bash – coincidencia de variables que no distingue entre mayúsculas y minúsculas

Después de consultar especialistas en la materia, programadores de varias ramas y profesores dimos con la respuesta al dilema y la dejamos plasmada en este post.

Solución:

Pescado estándar

No hay necesidad de usar eso ksh-estilo [[...]] comando, puede utilizar el estándar shcase construir aquí:

case $LINUX_CONF in
  ([Nn][Oo]) echo linux;;
  (*)        echo not linux;;
esac

O nombrando cada posible caso individualmente:

case $LINUX_CONF in
  (No | nO | NO | no) echo linux;;
  (*)                 echo not linux;;
esac

intento

Para bash-manera específica de hacer coincidencias que no distinguen entre mayúsculas y minúsculas, puede hacer:

shopt -s nocasematch
[[ $LINUX_CONF = no ]] && echo linux

O:

[[ $LINUX_CONF,, = no ]] && echo linux

(dónde $VAR,, es la sintaxis para convertir un string a minúsculas).

También puede forzar que una variable se convierta a minúsculas al asignarla con:

typeset -l LINUX_CONF

Eso también proviene de ksh y también está respaldado por bash y zsh.

Más variantes con otras conchas:

zsh

set -o  nocasematch
[[ $LINUX_CONF = no ]] && echo linux

(igual que en bash).

setopt extendedglob
[[ $LINUX_CONF = (#i)no ]] && echo linux

(menos peligroso que hacer todos coincide con mayúsculas y minúsculas)

[[ $(L)LINUX_CONF = no ]] && echo linux

(convertir a operador minúscula)

set -o rematchpcre
[[ $LINUX_CONF =~ '^(?i)noz' ]]

(sintaxis PCRE)

ksh93

[[ $LINUX_CONF = ~(i)no ]]

o

[[ $LINUX_CONF = ~(i:no) ]]

Tenga en cuenta que todos los enfoques anteriores que no sean [nN][oO] hacer coincidencias que no distingan entre mayúsculas y minúsculas depende de la configuración regional del usuario. No todas las personas en todo el mundo están de acuerdo en cuál es la versión en mayúsculas de una letra dada, incluso para las ASCII.

En la práctica para los ASCII, al menos en los sistemas GNU, las desviaciones de las reglas inglesas parecen estar limitadas a la i y I letras y si el punto está allí o no en la versión en mayúsculas o minúsculas.

Lo que eso significa es que [[ $VAR,, = oui ]] no se garantiza que coincida en OUI en todos los lugares (incluso cuando el error en las versiones actuales de bash está arreglado).

Mantenga su comando existente pero en la línea antes de ejecutar esto:

LINUX_CONF=$(echo $LINUX_CONF | awk ' print tolower($0) ')

Independientemente del caso del valor almacenado en su variable, esto obligará a que el valor de reemplazo esté en minúsculas. Esto da como resultado hacer coincidir su comando existente con solo una línea de código adicional.

Ten en cuenta dar visibilidad a este tutorial si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *