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
Здесь регулярное выражение
^[^'\!'@#\$%^\&*()_+]*['\!'@#\$%^\&*()_+][^'\!'@#\$%^\&*()_+]+$
соответствует всем строкам с точным появлением специального символа
Прекратите записывать свою собственную сложность проверки пароля и позволить людям использовать кодовые фразы. –
Я не думаю, что проверочные тесты для «одного и только одного» ... Конечный '*' может содержать любое количество дополнительных «специальных» символов ... Поэтому он действительно проверяет только «хотя бы один». – twalberg