Ceci est portable pour Dash et al. et à mon humble avis plus élégant.
case $str in
*['!&()'@#$%^*_+]* ) echo yup ;;
esac
Associez-le à un globe. Il vous suffit d'échapper les caractères que le shell considère autrement comme spéciaux :
#!/bin/bash
str='some text with @ in it'
if [[ $str == *['!'@#\$%^\&*()_+]* ]]
then
echo "It contains one of those"
fi