2016-10-27 7 views
2

Я пытаюсь проверить строку для любой буквы верхнего уровня. мой код показывает NO UPPER для любого входа, это может быть "SSS", "Sss", "SSS"Строка проверки скрипта Bash для прописной буквы

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

Что это вы думаете, что регулярное выражение соответствует? Почему у вас есть строчные буквы 'a-z' и цифры 0-9? –

+0

О, бог ffs. Не понял. Спасибо ! –

ответ

0

[^a-zA-Z0-9] означает что-нибудь для a-z кроме, т.е. строчных букв, A-Z, то есть прописные буквы, и 0-9, т.е. цифры. sss, Sss, SSS все содержат только буквы, поэтому они не могут совпадать.

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

имеет значение true, если пароль содержит любую прописную букву.

Вы должны установить LC_ALL перед запуском такого рода испытаний, как, например,

$ 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:]] должен работать всегда.

0

Ваше регулярное выражение неверно. Используйте [A-Z] или [: upper:].

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

+0

подсказка для вас: '[: upper:]' и все остальные аналогичные представляют только классы, чтобы соответствовать, вам нужен дополнительный слой скобки над ними. поэтому '[A-Z]' эквивалентно '[[: upper:]]' – HuStmpHrrr

+0

@HuStmpHrrr: эквивалентно при некоторых настройках 'locale'. – choroba

+0

@choroba строго да, вы правы. – HuStmpHrrr