Comment vérifier si une chaîne contient des caractères spéciaux (!@#$%^&*()_+)

Je me demandais quelle serait la meilleure façon de vérifier si une chaîne de caractères comme

$str 

contient l'un des caractères suivants

!@#$%^&*()_+

J'ai pensé à l'aide de valeurs ASCII, mais était un peu confus sur exactement comment cela pourrait être mis en œuvre.

Ou si il y a un moyen plus simple de simplement vérifier la chaîne contre les valeurs.

Si vous voulez juste pour vérifier la non-alphanumériques, par la manière, ce serait [[ $str = *[^[:alnum:]]* ]].
...ou, pour vérifier tout/toutes sortes de signes de ponctuation, [[ $str = *[[:punct:]]* ]]. En général, l'utilisation des classes de caractères POSIX (tout caractère de classe dans man 7 regexp sur Linux va fonctionner, même si glob-style les modèles ne sont pas POSIX REs) plutôt que d'énumérer personnages un par un est une bonne idée, si il y a une classe de caractère qui s'adapte (ou dont la négation pour) ce que vous faites.

OriginalL'auteur deadcell4 | 2014-10-29