diff --git a/SC2221.md b/SC2221.md new file mode 100644 index 0000000..a0bf01d --- /dev/null +++ b/SC2221.md @@ -0,0 +1,41 @@ +## This pattern always overrides a later one. + +### Problematic code: + +```sh +case "$1" in + -?) echo "Usage: $0 [-n]";; + -n) echo "Hello World";; + *) exit 1;; +esac +``` + +### Correct code: + +```sh +case "$1" in + -\?) echo "Usage: $0 [-n]";; + -n) echo "Hello World";; + *) exit 1;; +esac +``` +### Rationale: + +You have specified multiple patterns in a `case` statement, where one will always override the other. + +In the example, `-?` actually matches a dash followed by any character, such as `-n`. This means that the later `-n` branch will never trigger. In this case, the correct solution is to escape the `-\?` so that it doesn't match `-n`. + +Another common reason for this is accidentally duplicating a branch. In this case, fix or delete the duplicate branch. + +### Exceptions: + +None. One could argue that having `-*|--*) echo "Invalid flag";` is a readability issue, even though the second pattern follows from the first. In this case, you can either rearrange the pattern from most to least specific, i.e. `--*|-*)` or ignore the error. + +When ignoring this error, remember that ShellCheck directives have to go in front of the `case` statement, and not in front of the branch: + + # shellcheck disable=SC2221,SC2222 + case "$1" in + -n) ...;; + # no directive here + -*|--*) echo "Unknown flag" ;; + esac \ No newline at end of file