4

How do I check if a variable contains characters (regex) other than 0-9a-z and - in pure bash?

I need a conditional check. If the string contains characters other than the accepted characters above simply exit 1.

1
  • 2
    what about if [[ "$string" =~ [^a-z0-9-] ]]; then exit 1; else echo all fine; fi Commented Nov 8, 2013 at 2:44

3 Answers 3

3

One way of doing it is using the grep command, like this:

 grep -qv "[^0-9a-z-]" <<< $STRING

Then you ask for the grep returned value with the following:

if [ ! $? -eq 0 ]; then
    echo "Wrong string"
    exit 1
fi

As @mpapis pointed out, you can simplify the above expression it to:

grep -qv "[^0-9a-z-]" <<< $STRING || exit 1

Also you can use the bash =~ operator, like this:

if [[ ! "$STRING" =~ [^0-9a-z-] ]] ; then  
    echo "Valid"; 
else 
    echo "Not valid"; 
fi
Sign up to request clarification or add additional context in comments.

4 Comments

you can also grep ... || exit 1
Do I need to escape the - in [^0-9a-z-], so [^0-9a-z\-]? Also, isn't the first case echo "Not valid" instead of echo "Valid".
No, you don't need to escape the - (not even in the grep solution), the first case should be Valid because the conditional is negated (using the ! operator before the regex test), the condition ask if $STRING contains a character that is not a digit, - or a letter, if this evaluates to false ($STRING contains only letters, digits and/or -) the negation turns the evaluation true
2

case has support for matching:

case "$string" in
  (+(-[[:alnum:]-])) true ;;
  (*) exit 1 ;;
esac

the format is not pure regexp, but it works faster then separate process with grep - which is important if you would have multiple checks.

1 Comment

case supports glob patterns, not regular expressions. The example uses extended glob patterns, which are often not enabled out of the box. But if your needs are simple, glob patterns are simpler to write and understand, and quite possibly faster to process than regular expressions.
0

Using Bash's substitution engine to test if $foo contains $bar

bar='[^0-9a-z-]'
if [ -n "$foo" -a -z "${foo/*$bar*}" ] ; then
  echo exit 1
fi

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.