=~
, it'll match literally rather than as a
regex.[[ $foo =~ "^fo+ bar$" ]]
[[ $foo =~ ^fo+\ bar$ ]]
Quotes on the right hand side of =~
can be used to match
literally, so that [[ $1 =~ ^"$2".* ]]
works even if
$2
contains regex metacharacters. This mirrors the behavior
of globs, [[ $1 = "$2"* ]]
.
This also means that the problematic code tries to match literal carets and plus signs instead of interpreting them as regular expression matchers. To match as a regex, the regex metacharacters it must be unquoted. Literal parts of the expression can be quoted with double or single quotes, or escaped.
If you do want to match literally just to do a plain substring
search, e.g. [[ $foo =~ "bar" ]]
, you could ignore this
message, but consider using a more canonical glob match instead:
[[ $foo == *"bar"* ]]
.
compat31
disabled
(the default), quoted patterns are literal whereas unquoted
patterns are parsed for regex metacharacters.compat31
enabled, quoted and unquoted patterns match identically.See http://stackoverflow.com/questions/218156/bash-regex-with-quotes
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.