Questo è portatile per Dash et al. e IMHO più elegante.
case $str in
*['!&()'@#$%^*_+]* ) echo yup ;;
esac
Abbinalo a un globo. Devi solo eseguire l'escape dei caratteri che altrimenti la shell considera speciali:
#!/bin/bash
str='some text with @ in it'
if [[ $str == *['!'@#\$%^\&*()_+]* ]]
then
echo "It contains one of those"
fi