$?
refers to echo/printf, not a previous command. Assign to
variable to avoid it being overwritten.mycommand
echo "Command exited with $?"
if [ $? -ne 0 ]
then
echo "Failed"
fi
mycommand
ret=$?
echo "Command exited with $ret"
if [ $ret -ne 0 ]
then
echo "Failed"
fi
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.
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
ShellCheck is a static analysis tool for shell scripts. This page is part of its documentation.