2012-05-22 13 views
5

Teniendo en cuenta lo siguiente:¿Por qué la instrucción de mayúsculas y minúsculas no es sensible a mayúsculas/minúsculas cuando nocasematch está desactivado?

$ echo $BASH_VERSION 
4.2.10(1)-release 

$ shopt | fgrep case 
nocaseglob  off 
nocasematch  off 

$ case A in [a-z]) echo TRUE;; esac 
TRUE 

espero que la letra mayúscula A debe no coincidir con la clase de caracteres en minúscula de [a-z], pero lo hace. ¿Por qué no falla este partido?

+0

'nocaseglob' no está relacionada:' Si conjunto, golpe coincide con los nombres de archivo de una manera sensible a las mayúsculas cuando se realiza la expansión de nombre de ruta (véase expansión de nombre de camino arriba) ', aunque el comportamiento es aún impar. – Daenyth

Respuesta

7

No puede usar el tablero de manera confiable de esta manera. Si yo no uso guiones, funciona como se esperaba:

$ bash --version 
GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
$ shopt -s nocasematch 
$ case A in [abc]) echo TRUE;; esac 
TRUE 
$ shopt -u nocasematch 
$ case A in [abc]) echo TRUE;; esac 
$ 

Pero con guiones, imprime cierto independientemente de la configuración de nocasematch.

Bash está haciendo coincidencia de patrón aquí. Echa un vistazo a this section of the reference manual donde dice que con el guión Might puede interpretar [a-z] como [A-Za-z]! Le indica cómo obtener la interpretación tradicional (configure LC_COLLATE o LC_ALL en C). Básicamente, su configuración regional predeterminada está ordenando en orden de diccionario. El manual de referencia explica las cosas bastante bien.

ADENDA

bien tengo una transcripción para usted.

$ shopt -u nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
TRUE 
$ shopt -s nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
TRUE 
$ LC_ALL=C 
$ shopt -u nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
$ shopt -s nocasematch 
$ case A in [a-z]) echo TRUE;; esac 
TRUE 
7

Tiene que ver con su configuración regional. Específicamente, la secuencia de clasificación es una con insensibilidad a mayúsculas y minúsculas.

Por ejemplo, con LC_COLLATE conjunto de en_AU.utf8 (el valor por defecto en mi sistema), se puede ver que incluye letras minúsculas y mayúsculas en conjunto:

pax> case A in [a-b]) echo TRUE;; esac 
TRUE 
pax> _ 

pero, si se deshace del especificador de rango, funciona como se esperaba:

pax> case A in [ab]) echo TRUE;; esac 
pax> _ 

eso es porque los primeros medios between a and b inclusive que, por orden de clasificación que incluye A. Para este último significa a y b solamente, no un rango que se vería afectado por la secuencia de clasificación.

Si establece la secuencia de clasificación a uno entre mayúsculas y minúsculas, funciona como se espera:

pax> export LC_COLLATE="C" 
pax> case A in [a-b]) echo TRUE;; esac 
pax> 

Si lo que desea es hacer esto como una operación de una sola vez sin afectar a ninguna otra cosa, que pueda hacerlo de una sub-shell:

(export LC_COLLATE="C" ; case A in [a-b]) echo TRUE;; esac) 
Cuestiones relacionadas