2012-05-22 11 views
5

Biorąc pod uwagę następujące elementy:Dlaczego nie jest rozróżniana wielkość liter w przypadku, gdy nocemon jest wyłączony?

$ echo $BASH_VERSION 
4.2.10(1)-release 

$ shopt | fgrep case 
nocaseglob  off 
nocasematch  off 

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

Spodziewam się, że litera powinny nie dopasować małą klasę znaków [a-Z], ale robi. Dlaczego ten mecz się nie powiódł?

+0

'nocaseglob' ma związku:' Jeśli jest ustawiona, bash mecze nazw w sposób uwzględniania wielkości liter podczas wykonywania ekspansja ścieżka (patrz pathName Expansion powyżej) ', choć zachowanie jest nadal dziwny. – Daenyth

Odpowiedz

7

Nie można w niezawodny sposób używać myślnika w ten sposób. Jeśli nie używam kreski, to działa zgodnie z oczekiwaniami:

$ 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 
$ 

Ale z kreski, drukuje tak niezależnie od ustawienia nocasematch.

Bash wykonuje tutaj dopasowywanie wzorców. Sprawdź this section of the reference manual, gdzie mówi, że za pomocą łącznika MIGHT interpretuj [a-z] jako [A-Za-z]! Mówi ci, jak uzyskać tradycyjną interpretację (ustaw LC_COLLATE lub LC_ALL na C). Zasadniczo twoje domyślne ustawienia regionalne są sortowane w kolejności słownikowej. Podręcznik referencyjny dość dobrze wyjaśnia sytuację.

DODATEK

Ok mam zapis dla ciebie.

$ 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

Ma to związek z ustawieniami regionalnymi. W szczególności kolejność zestawiania jest jedna z niewrażliwością na wielkość liter.

Na przykład, z LC_COLLATE zestaw do en_AU.utf8 (domyślnie w moim systemie), widać, że zawiera małe i wielkie litery razem:

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

ale jeśli pozbyć specyfikatorem zakresie, działa zgodnie z oczekiwaniami:

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

to dlatego, że pierwsze środki between a and b inclusive, które dla tej kolejności zestawiania obejmuje A. W przypadku tych ostatnich oznacza to tylko zakres, na który sekwencja zestawiania ma wpływ.

Jeśli ustawisz kolejność zestawiania do jednego wielkość liter, to działa zgodnie z oczekiwaniami:

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

Jeśli chcesz po prostu zrobić to jako operacja jednorazowa bez wpływu na cokolwiek innego, można zrobić w sub-shell:

(export LC_COLLATE="C" ; case A in [a-b]) echo TRUE;; esac) 
Powiązane problemy