mirror of
https://github.com/koalaman/shellcheck.git
synced 2025-10-03 19:29:44 +08:00
Created SC2249 (markdown)
70
SC2249.md
Normal file
70
SC2249.md
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
## Consider adding a default *) case, even if it just exits with error.
|
||||||
|
|
||||||
|
### Problematic code:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
case "$1" in
|
||||||
|
start) start_service ;;
|
||||||
|
stop) stop_service ;;
|
||||||
|
restart|reload|force-reload)
|
||||||
|
stop_service;
|
||||||
|
start_service;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
### Correct code:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
case "$1" in
|
||||||
|
start) start_service ;;
|
||||||
|
stop) stop_service ;;
|
||||||
|
restart|reload|force-reload)
|
||||||
|
stop_service;
|
||||||
|
start_service;;
|
||||||
|
*)
|
||||||
|
echo >&2 "Invalid choice: $1"
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rationale:
|
||||||
|
|
||||||
|
ShellCheck found a `case` statement that may not be considering all possible cases. This may mean that only the [happy paths](https://en.wikipedia.org/wiki/Happy_path) are accounted for.
|
||||||
|
|
||||||
|
Consider adding a default case to handle other values. If you don't know what to do or don't believe it'll ever happen, exiting with an error is good, fail-fast practice.
|
||||||
|
|
||||||
|
The example is adapted from a real world Debian init script, which due to a missing default case reports success on any misspelled command (here with underscore instead of dash):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ /etc/init.d/screen-cleanup force_reload && echo success
|
||||||
|
success
|
||||||
|
```
|
||||||
|
|
||||||
|
### Exceptions:
|
||||||
|
|
||||||
|
This suggestion only triggers in verbose mode (`-S verbose`).
|
||||||
|
|
||||||
|
If you don't have a default case because the default should be to take no action, consider adding a comment to other humans:
|
||||||
|
|
||||||
|
```
|
||||||
|
case "$(uname)" in
|
||||||
|
CYGWIN*) cygwin=1;;
|
||||||
|
MINGW*) mingw=1;;
|
||||||
|
*) # No special workarounds identified
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
If you believe that it's impossible for the expression to have any other value, it's considered good practice to add the equivalent of an `assert(0)` to fail fast if this assumption should turn out to be incorrect in the current or future versions:
|
||||||
|
|
||||||
|
```
|
||||||
|
case "$result" in
|
||||||
|
true) proceed;;
|
||||||
|
false) cancel;;
|
||||||
|
*) echo >&2 "Submit bug report: '$result' should be true or false."
|
||||||
|
exit 127
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
### Related resources:
|
||||||
|
|
||||||
|
* Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!
|
Reference in New Issue
Block a user