Skip to content

Latest commit

 

History

History
47 lines (33 loc) · 1.43 KB

SC2222.md

File metadata and controls

47 lines (33 loc) · 1.43 KB

Pattern: case never matches because of a previous pattern

Issue: -

Description

You have specified multiple patterns in a case statement, where one will always override the other.

Example of incorrect code:

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

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.

Example of correct code:

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

Exceptions

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

Further Reading