2014-10-31 2 views
0

Я этоBash - Как проверить, если строка содержит более одного специального cahracter

if [[ ! $newstring == *['!'@#\$%^\&*()_+]* ]] 
then 
    echo Error - Does not contain One Special Character - $newstring 
    i=$((i+1)) 
fi 

, который проверяет, если строка имеет только один одиночный символ из банка, я хочу, чтобы проверить, если он имеет более одного ?

Что было бы лучшим способом?

+1

Прекратите записывать свою собственную сложность проверки пароля и позволить людям использовать кодовые фразы. –

+0

Я не думаю, что проверочные тесты для «одного и только одного» ... Конечный '*' может содержать любое количество дополнительных «специальных» символов ... Поэтому он действительно проверяет только «хотя бы один». – twalberg

ответ

2

Либо добавить второй класс

if [[ "$newstring" != *['!'@#\$%^\&*\(\)_+]*['!'@#\$%^\&*\(\)_+]* ]] 

или раздеть что-нибудь еще, и проверить длину

t="${newstring//[^[email protected]#\$%^\&*()_+]}" 
if [ ${#t} -lt 2 ] 
+0

Любая причина, по которой вы пишете '[[! x == y]] 'versus' [[x! = y]] '? –

+0

@glennjackman Скопированный стиль OPs, нет веской причины. –

0
#!/bin/bash 

a='!*@%6789'; 
if [[ `echo $a | sed "s/\(.\)/\1\n/g"|grep -c "[[:punct:]]"` -gt 1 ]]; then echo shenzi; else echo koba; fi 
+2

Для этого требуется, по крайней мере, одна суб-оболочка и две внешние команды. –

+0

Согласен. спасибо, что указал на Этана. –

0

grep может быть полезным для обеспечения матча

grep -oP "^[^'\!'@#\$%^\&*()_+]*['\!'@#\$%^\&*()_+][^'\!'@#\$%^\&*()_+]+$" 

тест

$ echo "#asdfasdf234" | grep -oP "^[^'\!'@#\$%^\&*()_+]*['\!'@#\$%^\&*()_+][^'\!'@#\$%^\&*()_+]+$" 

будет соответствовать строке как

#asdfasdf234 

$ echo "#asdf#asdf234" | grep -oP "^[^'\!'@#\$%^\&*()_+]*['\!'@#\$%^\&*()_+][^'\!'@#\$%^\&*()_+]+$" 

не будет соответствовать строке

if конструкция может быть

echo $newstring| grep -oP "^[^'\!'@#\$%^\&*()_+]*['\!'@#\$%^\&*()_+][^'\!'@#\$%^\&*()_+]+$" 
if [[ $? -eq 0 ]] > /dev/null 
then 
    echo Error - Does not contain One Special Character - $newstring 
    i=$((i+1)) 
fi 

Здесь регулярное выражение

^[^'\!'@#\$%^\&*()_+]*['\!'@#\$%^\&*()_+][^'\!'@#\$%^\&*()_+]+$ 

соответствует всем строкам с точным появлением специального символа

+0

Вы могли бы использовать [[: punct:]]? –

+0

@ArunSangal да, я мог бы. просто скопирован из вопроса OP. – nu11p01n73R

1

Для решения этой проблемы мы можем использовать tr.

$ string='[email protected][email protected]#*&%)([email protected]#@#' 

$ number=$(($(tr -d '[[:alnum:]]' <<< "$string"|wc -m) - 1)) 

$ echo "We have $number of special characters" 
$ 16 

Это должно быть короткое и быстрое.

Смежные вопросы