How to check if a string contains a special charac

2019-06-18 15:48发布

问题:

I was wondering what would be the best way to check if a string as

$str 

contains any of the following characters

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

I thought of using ASCII values but was a little confused on exactly how that would be implemented.

Or if there is a simpler way to just check the string against the values.

回答1:

Match it against a glob. You just have to escape the characters that the shell otherwise considers special:

#!/bin/bash
str='some text with @ in it'
if [[ $str == *['!'@#\$%^\&*()_+]* ]]
then
  echo "It contains one of those"
fi


回答2:

This is portable to Dash et al. and IMHO more elegant.

case $str in
  *['!'@#$%^&*()_+]* ) echo yup ;;
esac


回答3:

Using expr

str='some text with @ in it'
if [ `expr "$str" : ".*[!@#\$%^\&*()_+].*"` -gt 0 ];
    then 
       echo "This str contain sspecial symbol"; 
       fi


回答4:

You can also use a regexp:

if [[ $str =~ ['!@#$%^&*()_+'] ]]; then
    echo yes
else
    echo no
fi

There is nothing to escape because the special chars are in the single-quoted string; the [] means "anything in the contained string"; and because there is no ^ or $ in the pattern it will match anywhere in the $str.



回答5:

I think one simple way of doing would be like remove any alphanumeric characters and space.

echo "$str" | grep -v "^[a-zA-Z0-9 ]*$"

If you have a bunch of strings then put them in a file like strFile and following command would do the needful.

cat strFile | grep -v "^[a-zA-Z0-9 ]*$"



标签: linux bash shell