3 SC2221
Stavros Ntentos edited this page 2019-02-20 09:50:28 +02:00

This pattern always overrides a later one.

Problematic code:

case "$1" in
  -?) echo "Usage: $0 [-n]";;
  -n) echo "Hello World";;
   *) exit 1;;
esac

Correct code:

case "$1" in
  -\?) echo "Usage: $0 [-n]";;
# '-?') echo "Usage: $0 [-n]";;  # Also valid
  -n) echo "Hello World";;
   *) exit 1;;
esac

Rationale:

You have specified multiple patterns in a case statement, where one will always override the other. The pattern being overridden is indicated with a SC2222 warning.

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