=~
, 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.