This $?
refers to echo/printf, not a previous command. Assign to variable to avoid it being overwritten.
Problematic code:
mycommand
echo "Command exited with $?"
if [ $? -ne 0 ]
then
echo "Failed"
fi
Correct code:
mycommand
ret=$?
echo "Command exited with $ret"
if [ $ret -ne 0 ]
then
echo "Failed"
fi
Rationale:
ShellCheck found a $?
that always refers to echo
or printf
.
This most commonly happens when trying to show $?
before doing something with it, without realizing that any such action will also overwrite $?
.
In the problematic example, echo "Command exited with $?"
was intended to show the exit code before acting on it, but the act of showing $?
also overwrote it, so the condition is always false. The solution is to assign $?
to a variable first, so that it can be used repeatedly.
Exceptions:
If you intentionally refer to echo
to get the result of a write, you can ignore this message. Alternatively, write it out as in if echo $$ > "$pidfile"; then status=0; else status=1; fi
Related resources:
- Help by adding links to BashFAQ, StackOverflow, man pages, POSIX, etc!
-
Installation
-
Usage
-
Integrating and extending
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.