Esto es portátil para Dash et al. y en mi humilde opinión más elegante.
case $str in
*['!&()'@#$%^*_+]* ) echo yup ;;
esac
Combínalo con un globo. Solo tiene que escapar de los caracteres que el shell considera especiales:
#!/bin/bash
str='some text with @ in it'
if [[ $str == *['!'@#\$%^\&*()_+]* ]]
then
echo "It contains one of those"
fi