Considérez ce script Bash:
#!/bin/bash
echo Enter any character
read char
case $char in
[a-z]) echo Lower case letter
;;
[A-Z]) echo Upper case letter
;;
[0-9]) echo Number
;;
?) echo Special char
;;
*) echo You entered more than one character
;;
esac
Si j'entre «a», la sortie est en minuscule , et c'est la même chose pour «A» ... Comment puis-je surmonter cela?
echo if case then do
.Réponses:
Pour plus d'informations sur l'expression régulière en minuscules de [az] et l'expression régulière en majuscules de [AZ] dans bash, voir Pourquoi l'instruction case n'est-elle pas sensible à la casse lorsque nocasematch est désactivé? .
la source
[0-9]
vous pouvez utiliser[[:digit:]]
. Vous pouvez trouver plus d'exemples dansman grep
, ou les classes de caractères Google posix .Le problème est que la plage de caractères
[a-z]
comprend en fait les lettres majuscules. Ceci est expliqué dans le manuel bash :Pour illustrer:
Donc, ce qui se passe, c'est que dans votre région (ce qui n'est pas le cas
C
),[a-c]
est en fait[aAbBcC]
. C'est pourquoi vous devriez plutôt utiliser les classes de caractères POSIX comme suggéré par @karel.la source
LC_COLLATE
pourC
, il est ok pour d' autres paramètres locaux , pour être différent. Le réglageLC_COLLATE
sur n'importe quoi maisC
est rarement une bonne idée mais malheureusement Ubuntu le fait (ce n'est pas le seul coupable de loin).