case "$1" in
-?) echo "Usage: $0 [-n]";;
-n) echo "Hello World";;
*) exit 1;;
esac
case "$1" in
-\?) echo "Usage: $0 [-n]";;
# '-?') echo "Usage: $0 [-n]";; # Also valid
-n) echo "Hello World";;
*) exit 1;;
esac
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.
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
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.