Per man bash
:
An additional binary operator, =~
, is available, with the same
precedence as ==
and !=
. When it is used, the string to the right of
the operator is considered an extended regular expression and
matched accordingly (as in regex(3)). The return value is 0 if
the string matches the pattern, and 1 otherwise. If the regular
expression is syntactically incorrect, the conditional
expression's return value is 2. If the shell option nocasematch
is enabled, the match is performed without regard to the case of
alphabetic characters. Any part of the pattern may be quoted to
force it to be matched as a string. Substrings matched by
parenthesized subexpressions within the regular expression are saved
in the array variable BASH_REMATCH
. The element of BASH_REMATCH
with
index 0 is the portion of the string matching the entire
regular expression. The element of BASH_REMATCH
with index n is the
portion of the string matching the nth parenthesized subexpression.
I quoted the whole thing here because I think it's useful to know. You use standard POSIX extended regular expressions on the right hand side.
In particular, the expression on the right side may match a substring of the left operand. Thus, to match the whole string, use ^
and $
anchors:
if [[ "$1" =~ ^a*$ ]]
then
echo $1
fi