usage() {
echo >&2 "Usage: $0 -i input"
exit 1
}
if [ "$1" = "--help" ]
then
usage
exit 0 # Unreachable
fi
usage() {
echo >&2 "Usage: $0 -i input"
}
if [ "$1" = "--help" ]
then
usage
exit 0
fi
The problematic code wanted to exit with success if the user
explicitly asked for --help
. However, since the
usage
function already had an exit 1
, this
statement could never run.
One possible solution is to change usage()
to only echo,
and let callers be responsible for exiting.
ShellCheck may incorrectly believe that code is unreachable if it's invoked by variable name or in a trap. In such a case, please Ignore the message.
Note in particular that since unreachable commands may come in
clusters, it's useful to use ShellCheck's filewide or functionwide
ignore directives. A disable
directive before a function
ignores the entire function:
#!/bin/bash
...
# shellcheck disable=SC2317 # Don't warn about unreachable commands in this function
start() {
echo Starting
/etc/init.d/foo start
}
"$1"
exit 0
A disable directive after the shebang, before any commands, will ignore the entire file:
#!/bin/bash
# Test script #1
# shellcheck disable=SC2317 # Don't warn about unreachable commands in this file
echo "Temporarily disabled"
exit 0
run-test1
run-test2
run-test3
Defined functions are assumed to be reachable when the script ends (not exits) since another file may source and invoke them.
You have defined two functions in the same file you are sourcing whose names are the same but defined differently within their bodies. Then shellcheck will state that every line of the body of the earlier seen function definition will be unreachable which is how bash would operate when sourcing the file. It unclear what shellcheck would output if the earlier definition appeared in a difference file that was seen first. Apparently doing a quick test. It does NOT notice.
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.