Skip to content
koalaman edited this page Sep 16, 2017 · 1 revision

Invalid flags are not handled. Add a *) case.

Problematic code:

#!/bin/sh
while getopts "vr" f
do
  case "$f" in
    v) echo "verbose" ;;
    r) echo "recursive" ;;
  esac
done

Correct code:

#!/bin/sh
while getopts "vr" f
do
  case "$f" in
    v) echo "verbose" ;;
    r) echo "recursive" ;;
    *) echo "usage: $0 [-v] [-r]" >&2
       exit 1 ;;
  esac
done

Rationale:

The case statement handling getopts arguments does not have a default branch to handle unknown flags.

When a flag is not recognized, such as if passing -Z to the example code, getopts will set the variable to a literal question mark ?. This should be handled along with all the valid flags, usually by printing a usage message and exiting with failure.

Using a \?) or ?) case will also match invalid flags, but*) would additionally match things like the empty string if the variable name was misspelled.

Exceptions:

If your script's logic handles unrecognized flags in another way, e.g. after the case statement, you can ignore this warning.

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally