test command also known as
[ doesn't have a
=~ operator. Most shells have that command built-in nowadays.
The Korn shell introduced a
[[...]] construct (not a
[[ command) with alternate syntax and different parsing rules.
bash copied that to some extent with restrictions and many differences but that never was standardized, so shouldn't be used in portable
ksh93 always had a way to convert an extended regexp to its globs with:
printf '%P\n' "regexp"
And you could then do:
[[ $var = pattern ]]
Later (some time between 2001 and 2003) it also incorporated regular expressions in its globs like with the
~(E)regex syntax for extended regular expressions, so you can do:
[[ $var = ~(E)pattern ]]
That kind of pattern matching only works with the
[[...]] construct or
case, not the
zsh added a regexp matching operator for both its
[ command and
[[...]] first in 2001 with a
pcre module. The syntax was initially
[ string -pcre-match regex ] or
[[ string -pcre-match regex ]].
bash added a
=~ operator in bash 3.0 (in 2004). Using extended regular expressions. That was added shortly after by ksh93 and zsh as well (again with differences).
bash-3.1 and above use quoting to escape regexp operator causing all sorts of confusion and meaning it can't be used with the
[ command there.
zsh doesn't have that problem (quotes are used for shell quoting, and backslash to escape regex operator as usual), so the
=~ operator works in
[ command (though itself needs quoted since
=foo is a globbing operator in
yash (a small POSIX shell) doesn't have
[[...]] but its
[ command has a
=~ operator (using EREs) and works as you'd expect (like
In any case, neither
=~ are POSIX and should be used in
sh scripts. The standard command to do regular expression matching on strings is
if expr "x$var" : "x$regex" > /dev/null; then...
expr regexps are anchored at the start, and you need that
x trick to avoid problems with
$var values that are
Most of the time however, you don't need regexp as simple shell pattern matching is enough for most cases:
case $var in
(pattern) echo matches