diff --git a/SC2076.md b/SC2076.md new file mode 100644 index 0000000..6c8c7d7 --- /dev/null +++ b/SC2076.md @@ -0,0 +1,19 @@ +## Don't quote rhs of =~, it'll match literally rather than as a regex. + +### Problematic code: + + [[ $foo =~ "^fo+bar$" ]] + +### Correct code: + + [[ $foo =~ ^fo+bar$ ]] + +### Rationale: + +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, it must be unquoted. + +### Exceptions: + +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"* ]]`. \ No newline at end of file