2016-10-27 1 views
2

J'essaie de vérifier une chaîne pour une lettre majuscule. mon code montre NO UPPER pour toute entrée, peut-il être "sss", "sss", "SSS"Chaîne de vérification de script Bash pour une lettre majuscule

if [[ "$pass" =~ [^a-zA-Z0-9] ]] 
then 
    echo "Upper found" 
else 
    echo "no upper" 
fi 
+0

Qu'est-ce que vous pensez que les matchs regex? Pourquoi avez-vous les lettres minuscules 'a-z' et les chiffres' 0-9 'dedans? –

+0

Oh mon Dieu ffs. Je ne m'en suis pas rendu compte. Je vous remercie ! –

Répondre

0

[^a-zA-Z0-9] signifie quoi que ce soit, sauf pour a-z, soit des lettres minuscules, A-Z, soit des lettres majuscules, et 0-9, c'est-à-dire les chiffres. sss, Sss, SSS ne contiennent que des lettres, donc ils ne peuvent pas correspondre.

[[ $password =~ [A-Z] ]] 

est vrai si le mot de passe contient une lettre majuscule.

Vous devez définir LC_ALL avant d'exécuter ce genre de tests, par exemple

$ LC_ALL=cs_CZ.UTF-8 bash -c '[[ č =~ [A-Z] ]] && echo match' 
match 
$ LC_ALL=C   bash -c '[[ č =~ [A-Z] ]] && echo match' 
# exit-code: 1 

[[:upper:]] devrait toujours travailler.

0

Votre expression régulière est erronée. Utilisez [A-Z] ou [: upper:].

https://en.wikipedia.org/wiki/Regular_expression

+0

un indice pour vous: '[: upper:]' et tous les autres similaires ne représentent que des classes, pour correspondre, vous avez besoin d'une couche supplémentaire de parenthèse sur eux. donc '[A-Z]' est équivalent à '[[: upper:]]' – HuStmpHrrr

+0

@HuStmpHrrr: Équivalent sous certains paramètres de 'locale'. – choroba

+0

@choroba rigoureusement oui, vous avez raison. – HuStmpHrrr