$? 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"
fimycommand
ret=$?
echo "Command exited with $ret"
if [ $ret -ne 0 ]
then
echo "Failed"
fiShellCheck 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.