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 sh
case
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.